【发布时间】:2018-03-28 11:35:00
【问题描述】:
我正在尝试创建一个应用程序,它可以像拖动一样在您的设备上移动 ImageView,例如,当我将 75% 的 ImageView 移出屏幕时,会显示 Toast。我一直在阅读有关MotionEvent 和onTouchListener 的信息,并且我已经关注了question,但这并不能说服我。
编辑
我当前的代码是:
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
int windowwidth;
int windowheight;
private ImageView mImageView;
private ViewGroup mRrootLayout;
private int _xDelta;
private int _yDelta;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DisplayMetrics displaymetrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
windowwidth = displaymetrics.widthPixels;
windowheight = displaymetrics.heightPixels;
mRrootLayout = (ViewGroup) findViewById(R.id.root);
mImageView = (ImageView) mRrootLayout.findViewById(R.id.im_move_zoom_rotate);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150);
mImageView.setLayoutParams(layoutParams);
mImageView.setOnTouchListener(this);
}
public boolean onTouch(View view, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
if(X == 0){
Toast.makeText(this, "OUT", Toast.LENGTH_SHORT).show();
}
else if (Y == 0){
Toast.makeText(this, "OUT", Toast.LENGTH_SHORT).show();
}
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.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:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
view.setLayoutParams(layoutParams);
break;
}
mRrootLayout.invalidate();
return true;
}
}
我做了那些if 和else if 只是为了知道ImageView 是否正在离开设备,在设备的左侧和右侧似乎没问题,但我想成功更干净而不是硬写,我也没有得到LayoutParams(150,150)为什么是150?我也不明白为什么我必须创建一个RelativeLayout.LayoutParams 以及为什么我必须放
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
我做了if/else if,因为我想在用户想要将ImageView从设备中取出时删除,所以我需要控制他何时尝试,目前我只得到它TOP/LEFT/对不对,我还获取设备的尺寸只是为了尝试 X 或 Y 是否与高度或宽度相同,只是显示 Toast 但它没有正确执行。
现在我的ImageView 是ic_launcher,但它会更大(几乎是中间屏幕)。
注意
如果您知道任何其他更简单或更简洁的方法,请随时将其放在这里,我不在乎我的代码,我可以调整它,我只是希望它清晰而不是硬编码。
【问题讨论】:
-
我遇到了类似的问题,然后得到了解决方案。 Checking Drag Out of Bounds
-
如果您知道如何解决它(如果已测试),请随时提出答案,我会对其进行测试:)
标签: android android-layout android-view android-custom-view