我在网上搜索了一个简单的解决方案,可以自由移动ImageView
。我终于找到了一些可以产生完美结果的代码:
public class MainActivity extends Activity implements View.OnTouchListener {
private int _xDelta;
private int _yDelta;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView j = (ImageView)findViewById(R.id.j);
j.setOnTouchListener(this);
}
public boolean onTouch(View view, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
ImageView j = (ImageView)findViewById(R.id.j);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
_xDelta = (int) (X - j.getTranslationX());
_yDelta = (int) (Y - j.getTranslationY());
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
j.setTranslationX(X - _xDelta);
j.setTranslationY(Y - _yDelta);
break;
}
return true;
}}
由于我真的不知道我的代码是如何工作的,所以我想看看是否有更好的解决方案。
这是我得到的解决方案:
private float xCoOrdinate, yCoOrdinate;
view.setOnTouchListener(new View.OnTouchListener() {
Float y1 = 0f, y2 = 0f;
@Override
public boolean onTouch(View v, MotionEvent event) {
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//xCoOrdinate = view.getX() - event.getRawX();
yCoOrdinate = view.getY() - event.getRawY();
Float puffer = 0f;
y1 = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
view.animate().y(event.getRawY() + yCoOrdinate).setDuration(0).start();
//view.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start();
break;
case MotionEvent.ACTION_UP:
y2 = event.getRawY();
Float dy = (y2 - y1);
if (dy < 0) {
//moved up
view.animate().y(size.y / 100 * -40).setDuration(100).start();
} else if (dy > 0) {
// moved down
view.animate().y(size.y / 2 - view.getHeight() / 2).setDuration(100).start();
}
break;
}
return false;
}
});
说明:如果向上或向下移动,我只需要在y轴上移动并进行检测。这是通过将视图的动画设置为动画来实现的,女巫各有利弊(相反:它很难检测空间中的视图/优点:视图实际上在移动,而不仅仅是出现在其他地方),但事实证明它最适合我,很简单。这里的目标是向上滑动视图并将其移至所需位置,就像向下滑动一样,返回到原始位置,这是相对于屏幕尺寸实现的。对我来说,代码是相对简单和易于解释的,但是请问是否有不清楚的地方。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句