Linjiajia
2023-07-25 82e57df230ecb744af6c8865f80870ba03c86d89
app/src/main/java/com/application/zhangshi_app_android/widget/TreeView.java
@@ -4,6 +4,7 @@
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -11,8 +12,10 @@
import android.view.View;
import android.widget.OverScroller;
import android.widget.RelativeLayout;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.constraintlayout.utils.widget.ImageFilterView;
import com.application.zhangshi_app_android.R;
@@ -48,7 +51,9 @@
    // 放大后手指移动位置
    private final OffSet moveOffset = new OffSet();
    private boolean isDoubleClickZoomIn = false;
    private ImageFilterView imageFilterView;
    public TreeView(Context context) {
        this(context, null);
    }
@@ -70,6 +75,18 @@
        layoutParams.alignWithParent = true;
        layoutParams.addRule(CENTER_IN_PARENT);
        addView(treeView,layoutParams);
        imageFilterView = treeView.findViewById(R.id.imageFilterView);
        imageFilterView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d("TAG", "onTouch: getX"+event.getX());
                Log.d("TAG", "onTouch: getY"+event.getY());
                Toast.makeText(mContext,"被触摸",Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        mGestureDetector = new GestureDetector(context, new MyGestureListener());
        mScaleGestureDetector = new ScaleGestureDetector(context, new MyScaleGestureListener());
        mOverScroller = new OverScroller(context);
@@ -102,24 +119,40 @@
        bigScale = (float) getHeight() / (float) treeView.getMeasuredHeight() * ZOOM_SCALE;
        // 当前缩放比例 = 缩放前的比例
        currentScale = smallScale;
        currentScale = 1;
        Log.d("TAG", "onSizeChanged: getX"+imageFilterView.getX());
        Log.d("TAG", "onSizeChanged: getY"+imageFilterView.getY());
    }
//    @Override
//    public boolean dispatchTouchEvent(MotionEvent ev) {
//        // 对触摸事件进行缩放和平移变换
//        MotionEvent event = MotionEvent.obtain(ev);
//        event.setLocation((event.getX() - moveOffset.getPhyX()) / currentScale, (event.getY() - moveOffset.getPhyY()) / currentScale);
//
//        // 将触摸事件传递给子视图
//        boolean handled = super.dispatchTouchEvent(event);
//
//        // 回收触摸事件
//        event.recycle();
//
//        return handled;
//    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.scale(currentScale, currentScale, getWidth() / 2f, getHeight() / 2f);
        // 移动画布
        if (isDoubleClickZoomIn){
            if (currentScale <= bigScale) {//双击改变状态时偏移量随着缩放比例变化
                float a = (currentScale - smallScale) / (bigScale - smallScale);
                moveOffset.setPhyX(moveOffset.getPhyX() * a);
                moveOffset.setPhyY(moveOffset.getPhyY() * a);
            }
        }
//        // 移动画布
//        if (isDoubleClickZoomIn){
//            if (currentScale <= bigScale) {//双击改变状态时偏移量随着缩放比例变化
//                float a = (currentScale - smallScale) / (bigScale - smallScale);
//                moveOffset.setPhyX(moveOffset.getPhyX() * a);
//                moveOffset.setPhyY(moveOffset.getPhyY() * a);
//            }
//        }
        canvas.translate(moveOffset.getLogX(currentScale), moveOffset.getLogY(currentScale));
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 双指操作
@@ -137,6 +170,9 @@
        // 双击情况 : 第二次抬起[ACTION_POINTER_UP]时候触发
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.d("onDown", "onUp: ");
            Log.d("onDown", "onUp: e.getX() = " + e.getX());
            Log.d("onDown", "onUp: e.getY() = " + e.getY());
            return super.onSingleTapUp(e);
        }
@@ -193,6 +229,7 @@
            return true;
        }
        // 双击 -- 第二次按下时候触发 (40ms - 300ms) [小于40ms是为了防止抖动]
        @Override
        public boolean onDoubleTap(MotionEvent e) {