安卓多点触控视图调整大小闪烁问题

3

我有一个视图,它有自定义的实现 - 我可以在上面画东西,然后我将这个视图在运行时添加到一个RelativeLayout布局中,方法如下:

  RelativeLayout paintRootView = (RelativeLayout) findViewById(R.id.root_view);
  RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
  paintView.setLayoutParams(params);

  PaintView paintView = new PaintView(context);
  paintRootView.addView(paintView);

我有一些控件,它们指定了何时onTouch方法应在视图上绘制/拖动视图或调整视图大小。绘制和平移视图正常工作,但当我尝试缩放视图时,它会闪烁。我错过了什么吗?

视频效果

使用的代码:

private int mode = NONE;
private float oldDist;
private static final float MIN_ZOOM = 0.5f;
private static final float MAX_ZOOM = 3.0f;


 @Override
public boolean onTouch(View view, MotionEvent event) {
    if (IS_IN_MOOVING_STATE) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {

            case MotionEvent.ACTION_DOWN: {
                // some code for drag
                mode = DRAG;
                break;
            }

            case MotionEvent.ACTION_POINTER_DOWN: {
                oldDist = getSpacing(event);
                mode = ZOOM;
                break;
            }

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP: {
                mode = NONE;
                break;
            }

            case MotionEvent.ACTION_MOVE: {
                if (mode == DRAG) {
                  // some code for drag

                } else if (mode == ZOOM) {
                    float newDist = getSpacing(event);

                    float scale = newDist / oldDist;

                    PointF pointF = getMidPoint(event);

                    if (scale >= MIN_ZOOM && scale < MAX_ZOOM) {
                        zoomPaintView(scale, scale, pointF);
                    }
                }

                break;
            }
        }

        paintRootView.invalidate();
        return true;
    }

    return false;
}

你能解决你的问题吗? - DolDurma
@ Mahdi.Pishguy 不是的。 - Choletski
你能试一下这个链接吗?https://judepereira.com/blog/multi-touch-in-android-translate-scale-and-rotate/ - DolDurma
我正在尝试使用这个教程来调整RecyclerView的项目大小。 - DolDurma
1个回答

0

我希望能够帮到你。这是伪代码,通过它我可以通过多点触控事件来改变TextView的大小。

public class MainActivity extends Activity implements OnTouchListener {

    final static float STEP = 200;
    TextView mytv;
    float mRatio = 1.0f;
    int   mBaseDist;
    float mBaseRatio;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mytv = (TextView) findViewById(R.id.textView);
        mytv.setTextSize(mRatio + 13);
    }

    public boolean onTouchEvent(MotionEvent event) {
        if (event.getPointerCount() == 2) {
            int action     = event.getAction();
            int pureaction = action & MotionEvent.ACTION_MASK;
            if (pureaction == MotionEvent.ACTION_POINTER_DOWN) {
                mBaseDist = getDistance(event);
                mBaseRatio = mRatio;
            } else {
                float delta = (getDistance(event) - mBaseDist) / STEP;
                float multi = (float) Math.pow(2, delta);
                mRatio = Math.min(1024.0f, Math.max(0.1f, mBaseRatio * multi));
                mytv.setLayoutParams(new LinearLayout.LayoutParams((int) (mRatio + 13), (int) (mRatio + 13)));
            }
        }
        return true;
    }

    int getDistance(MotionEvent event) {
        int dx = (int) (event.getX(0) - event.getX(1));
        int dy = (int) (event.getY(0) - event.getY(1));
        return (int) (Math.sqrt(dx * dx + dy * dy));
    }

    public boolean onTouch(View v, MotionEvent event) {
        return false;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接