通过onTouch()移动ImageView
通过onTouch()移动ImageView
我有一个AbsoluteLayout,我想通过我的触摸点在这个布局中移动我的ImageView。看看我的代码,当我触摸任何点时一切都很好,点保存在一个变量中,但是ImageView消失了,有什么想法吗?\n我的XML布局:\n
\n我的代码:\n
FstBall = (ImageView) findViewById(R.id.FirstBall); FstBall.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { float x = event.getX(); float y = event.getY(); int action = event.getAction(); float FnlResX = 0; float FnlResY = 0; if (action == MotionEvent.ACTION_MOVE) { FnlResX = x; FnlResY = y; int tst1 = (int) FnlResX; int tst2 = (int) FnlResY; FstBall.scrollBy(tst1, tst2); } return true; } });
问题:Move ImageView through onTouch()的原因和解决方法
在给定的代码中,onTouchEvent()方法用于在触摸事件发生时移动ImageView。但是,在实际使用过程中可能会出现一些问题。
问题的原因:
1. 代码中使用的是AbsoluteLayout.LayoutParams,这是一个已经过时的布局参数类。在较新的Android版本中,已经不推荐使用该类。
2. 使用绝对布局(AbsoluteLayout)来放置视图,这也是一个已经过时的布局。
3. 代码中没有进行边界检查,因此可能导致ImageView移动到屏幕外部。
解决方法:
1. 使用更适合的布局参数类,如RelativeLayout.LayoutParams或LinearLayout.LayoutParams。
2. 使用更合适的布局,如RelativeLayout或LinearLayout。
3. 在代码中添加边界检查,确保ImageView不会移动到屏幕外部。
修复后的代码如下所示:
public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(FstBall.getLayoutParams()); params.leftMargin = (int) event.getX(); params.topMargin = (int) event.getY(); FstBall.setLayoutParams(params); return true; }
通过上述修改,我们解决了原始代码中存在的问题。现在,ImageView将通过触摸事件在屏幕上移动,并且已经更新了布局参数和布局来适应较新的Android版本和布局标准。
问题的原因是,通过滚动窗口而不是实际移动视图,导致图像视图没有移动。解决方法是重写布局的onTouchEvent()方法,并在该方法中实现移动图像视图的逻辑。
首先,我们创建一个继承自AbsoluteLayout的自定义布局类MyAbsoluteLayout。在该类中,重写onTouchEvent()方法。在该方法中,首先获取当前深度的子视图,然后获取子视图的布局参数,并将其左边距和上边距设置为触摸事件的坐标。最后,将更新后的布局参数重新设置给子视图,并返回super.onTouchEvent()。
然后,在MyActivity类的onCreate()方法中,创建MyAbsoluteLayout的实例,并设置布局参数。接下来,创建一个ImageView实例,并设置其布局参数和背景。将ImageView添加到MyAbsoluteLayout中,并通过调用layout的setMovingChildDepth()方法设置当前移动的子视图的深度。最后,通过调用setContentView()方法将布局设置为当前活动的视图。
通过以上的实现,我们可以在触摸屏幕时移动ImageView视图。
注意:以上代码仅为伪代码,仅用于说明问题的原因和解决方法,并未经过实际测试。