基本上我的问题是:如何移动完整的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;
}
我不知道我做错了什么,如果有人可以提供帮助,我会非常感激。谢谢。
答案 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