java - 如果双指同时触摸屏幕,则无法捏合缩放

标签 java android gesture pinchzoom

我已经在我的自定义 View 上实现了缩放,该 View 在 Canvas 上绘制了一个网格,但是如果我将两个手指同时放在屏幕上,缩放将不起作用。我必须先放一个,然后放另一个。

我关注了this Adam Powell 的博客文章实现缩放,并制作了这个自定义 View :

public class ZoomView extends View{

    private float width;    
    private float height;   

    Paint lineColor; 
    Paint bgColor;

    private float mScaleFactor;
    private ScaleGestureDetector scaleDetector;

    public CanvasView(Context context) {
        super(context);
        setFocusable(true);
        setFocusableInTouchMode(true);

        lineColor = new Paint();
        lineColor.setColor(getResources().getColor(R.color.white));
        bgColor = new Paint();
        bgColor.setColor(getResources().getColor(R.color.black));

        mScaleFactor = 1;
        mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh){
        width = w/9;
        height = h/9;
        super.onSizeChanged(w,h,oldw,oldh);
    }

    @Override 
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);

        canvas.save();
        canvas.scale(mScaleFactor, mScaleFactor);     //for zooming

        for(int i=0; i <= 9; i++){
            canvas.drawLine(0,i*height, 9*width,i*height,lineColor);
            canvas.drawLine(i*width, 0, i*width, 9*height, lineColor);
        }

        canvas.restore();
    }

    @Override 
    public boolean onTouchEvent(MotionEvent ev){

        mScaleDetector.onTouchEvent(ev);
        return true;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        setMeasuredDimension(800, 1000);
    }

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            mScaleFactor *= detector.getScaleFactor();

            // Don't let the object get too small or too large.
            mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

            invalidate();
            return true;
        }
    }   
}

那么为什么缩放会这样呢? 任何帮助将不胜感激。谢谢!

最佳答案

这可能看起来像一个愚蠢的问题,但是多点触控行为是否适用于此设备上的其他应用程序(例如 map )? 我已经在 Android 4.0.3 的 LG Optimus Black 上测试了您的代码(略有改动,见下文),双指同时运行。

package com.example.teste;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;

public class ZoomView extends View {

private float width;
private float height;

Paint lineColor;
Paint bgColor;

private float mScaleFactor;
private ScaleGestureDetector mScaleDetector;

public ZoomView(Context context) {
    super(context);
    setFocusable(true);
    setFocusableInTouchMode(true);

    lineColor = new Paint();
    lineColor.setColor(getResources().getColor(R.color.ics_blue_bright));
    bgColor = new Paint();
    bgColor.setColor(getResources().getColor(R.color.black));

    mScaleFactor = 1;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    width = w / 9;
    height = h / 9;
    super.onSizeChanged(w, h, oldw, oldh);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.save();
    canvas.scale(mScaleFactor, mScaleFactor); // for zooming

    for (int i = 0; i <= 9; i++) {
        canvas.drawLine(0, i * height, 9 * width, i * height, lineColor);
        canvas.drawLine(i * width, 0, i * width, 9 * height, lineColor);
    }

    canvas.restore();
}

@Override
public boolean onTouchEvent(MotionEvent ev) {

    mScaleDetector.onTouchEvent(ev);
    return true;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(800, 1000);
}

private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        mScaleFactor *= detector.getScaleFactor();

        // Don't let the object get too small or too large.
        mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

        invalidate();
        return true;
    }
}
}

关于java - 如果双指同时触摸屏幕,则无法捏合缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16821583/

相关文章:

全屏模式下的 Android 3.1 软键盘

ScrollView 中的 iOS Signatureview 出现问题

java - 无法使用 eclipse 开始调试 java 应用程序

java - Firebase - 实时数据库为用户抛出异常设置附加值

java - 为什么 Collections.frequency 在转换后的列表上没有按预期工作?

SwiftUI View 阻止对 MapKit 的触摸,但不会阻止其他 View

ios - Swift 3 - 使用点击手势的 ImageView

java - 如何使用 Java 流按会计年度对项目进行分组

java - 为什么我的拖动方法滞后?

android - 在 Jetpack Compose 中设置负填充值的替代解决方案? (java.lang.IllegalArgumentException : Padding must be non-negative)