Android 安卓:这不是画画布的方式吗?

Android 安卓:这不是画画布的方式吗?,android,canvas,drag-and-drop,scale,multi-touch,Android,Canvas,Drag And Drop,Scale,Multi Touch,我是否误解了平移和缩放画布的工作原理?我创建了一个可以拖动和缩放的自定义视图,但它在我设置的范围内。我以为翻译画布会重新绘制边界?我希望能够在整个屏幕上拖动和缩放图像,而不是在视口中!我假设平移画布会调整视口 我是不是想错了 @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.translate(mPosX, mPosY); canvas

我是否误解了平移和缩放画布的工作原理?我创建了一个可以拖动和缩放的自定义视图,但它在我设置的范围内。我以为翻译画布会重新绘制边界?我希望能够在整个屏幕上拖动和缩放图像,而不是在视口中!我假设平移画布会调整视口

我是不是想错了

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    canvas.translate(mPosX, mPosY);
    canvas.scale(mScaleFactor, mScaleFactor);
    mIcon.draw(canvas);
    canvas.restore();
}
这就是我创建视图的方式。所以基本上它被卡在这个250 x 250的盒子里。我需要实际拖动视图。。我有种感觉,我在做一些愚蠢的事情,但我无法做出我想要的行为

    MultiTouchImageView view = new MultiTouchImageView(this);
    view.setLayoutParams(new RelativeLayout.LayoutParams(250, 250));

可以设置页边距以在布局中移动视图。我创造了这个创意,它看起来是这样的:

public class DragView extends View {

    private float mLastTouchX;
    private float mLastTouchY;

    private float mDeltaX;
    private float mDeltaY;

    public DragView(Context context) {
        super(context);
        init();
    }

    public DragView(final Context context, final AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                final int action = event.getAction();

                mLastTouchX = event.getRawX();
                mLastTouchY = event.getRawY();

                switch (action) {
                case MotionEvent.ACTION_DOWN: {
                    RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) getLayoutParams();
                    mDeltaX = mLastTouchX - lParams.leftMargin;
                    mDeltaY = mLastTouchY - lParams.topMargin;

                    break;
                }
                case MotionEvent.ACTION_MOVE: {
                    mLastTouchX = event.getRawX();
                    mLastTouchY = event.getRawY();

                    final RelativeLayout.LayoutParams params = (LayoutParams) getLayoutParams();
                    params.leftMargin = (int) (mLastTouchX - mDeltaX);
                    params.topMargin = (int) (mLastTouchY - mDeltaY);
                    setLayoutParams(params);

                    break;
                }
                }

                return true;
            }
        });
    }

}

我有一个类似的问题-我没有使用
canvas.scale()
mIcon.draw(canvas)
,而是使用
canvas.drawRect()
。我在屏幕上绘制的矩形会四处移动,但仅在视图的范围内。这就像视图的内容在移动,但视图本身没有在布局中移动。请尝试在移动中设置视图的左边框和上边框。因此,您的意思是,不要调用
invalidate()
并重新绘制视图,适当的方法不是“重画”视图,而是简单地在其布局内移动其边距?是的,正如我所知,在蜂窝状结构之前的版本上拖动视图是最方便的方法。在许多教程中,建议使用@pasta12描述的代码。我假设代码在视图中移动内容(即画布)(例如,边界设置为
fill\u parent
,因此画布可以在视图边界内的任何位置绘制)。我相信@pasta12代码只是在其他位置重新绘制内容,但实际位置保持不变。这意味着不可能点击那个视图。谢谢Vang,这向我解释了概念上的差异。不过,不确定@pasta12是否会接受它作为答案。