如何移动自定义视图?

时间:2012-07-10 19:22:22

标签: android android-layout android-custom-view

基本上我的问题是:如何移动完整的view,而不仅仅是移动canvas * 我有一个自定义{{1}并且我想要移动整个事情而不仅仅是view *

这是我尝试过的,但是我得到了canvas(代码不是完整的,我已经把我认为最相关的部分,也是自定义NullPointerException的父级。 a view):

ResistorView类:

LinearLayout

主要布局:

LinearLayout root;

public class ResistorView extends View{

    public ResistorView(Context context){
        super(context);         
        root = (LinearLayout)findViewById(R.id.main);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {        

    final int X = (int) event.getRawX();
    final int Y = (int) event.getRawY();
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            LinearLayout.LayoutParams lParams = (LinearLayout.LayoutParams) this.getLayoutParams();
            _xDelta = X - lParams.leftMargin;
            _yDelta = Y - lParams.topMargin;
            break;
        case MotionEvent.ACTION_UP:
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            break;
        case MotionEvent.ACTION_POINTER_UP:
            break;
        case MotionEvent.ACTION_MOVE:
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) this.getLayoutParams();
            layoutParams.leftMargin = X - _xDelta;
            layoutParams.topMargin = Y - _yDelta;
            layoutParams.rightMargin = -250;
            layoutParams.bottomMargin = -250;
            this.setLayoutParams(layoutParams);
            break;
    }
    root.invalidate(); //There is a NullPointerException on this line.
    return true;
    }

我不知道我做错了什么,如果有人可以提供帮助,我会非常感激。谢谢。

2 个答案:

答案 0 :(得分:0)

更改

root = (LinearLayout)findViewById(R.id.main);

root = (LinearLayout)getParent();

您甚至可能希望在onTouch中执行此操作,并将其从构造函数中删除,例如:

if(root == null) {
    root = (LinearLayout)getParent();
}
root.invalidate();

答案 1 :(得分:0)

我建议使用FrameLayout并调用myCustomView.setX(x)和myCustomView.setY(y) 传递给方法的x和y是事件rawX和rawY + deltaX和deltaY

ACTION_DOWN案例

deltaX = v.x - event.rawX
deltaY = v.y - event.rawY

deltaX和deltaY是全局变量

并在ACTION_MOVE案例中执行此操作

v.x = event.rawX + deltaX
v.y = event.rawY + deltaY