我正在处理一个应用程序,我想在其中拖动一个按钮。我写了两个程序。问题是,他们每个人都只满足我想要的特定部分。我想要一个可以在屏幕上自由移动的按钮(不消失和东西),我还需要程序给我移动(永久)时本地按钮位置的坐标。Android:拖放按钮(按钮消失;按钮的位置)
在第一个程序中,拖动按钮时消失的问题。这发生在x和y的负值以及正x值(不适用于正y值;这里是完美的一切)。正y值是按钮上方的所有内容,正x值是按钮右侧的所有内容,依此类推。对于负值,按钮会消失,就像覆盖按钮的墙一样。对于正x值,按钮随着x值的增加而消失(有点像水中的嘶嘶声片剂)。
下面是代码:
seat_leftright = (ImageButton) findViewById(R.id.seat_leftright);
seat_leftright.setOnTouchListener(new OnTouchListener() {
int k = 0;
int prevX,prevY;
int x=0;
int y=0;
@Override
public boolean onTouch(final View v,final MotionEvent event)
{
final LinearLayout.LayoutParams par=(LinearLayout.LayoutParams)v.getLayoutParams();
switch(event.getAction())
{
case MotionEvent.ACTION_MOVE:
{
if(k == 0){ //otherwise there would be an offset when touching the button the first time
prevY=(int)event.getRawY();
prevX=(int)event.getRawX();
}
y+=prevY -(int)event.getRawY();
prevY=(int)event.getRawY();
par.bottomMargin = y;
x+=(int)event.getRawX()-prevX;
prevX=(int)event.getRawX();
par.leftMargin = x;
Log.i("LOG","x: "+ x +", y: " + y);
k++;
v.setLayoutParams(par);
return true;
}
case MotionEvent.ACTION_UP:
{
par.bottomMargin=0;
par.leftMargin=0;
k=0;
y=0;
x=0;
v.setLayoutParams(par);
return true;
}
}
return false;
}
});
}
在我用DragShadowBuilder功能的第二程序。该按钮在此程序中完美工作,因此它不会消失或类似。在这里,我收到值的问题。移动时,我经常需要按钮的x和y位置。我用Action_drag_location试了一下,但是当我将按钮拖到另一个按钮的上方时(这里是按钮“arrow_down”),它只返回坐标。用我的背景替换“arrow_down”按钮以便不断接收坐标根本不起作用。我也尝试将我的第一个程序和第二个程序结合起来,结果我根本没有收到任何值。
我希望你能帮助我。我很感激每一种帮助!
下面的第二个程序的代码。
OnTouchListener myOnTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
view);
view.startDrag(null, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
return true;
}
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
view.setVisibility(View.VISIBLE);}
return true;
}
};
OnDragListener myDragListener = new OnDragListener() {
@Override
public boolean onDrag(View layoutview, DragEvent dragevent) {
int action = dragevent.getAction();
View view = (View) dragevent.getLocalState();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
Log.i("LOG","DragStarted");
break;
case DragEvent.ACTION_DRAG_ENTERED:
break;
case DragEvent.ACTION_DRAG_LOCATION:
float x = (int)layoutview.getX();
float y = (int)layoutview.getY();
Log.i("COORDS","X: " + x +" Y: " + y);
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DROP:
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.d("LOG", "Drag ended");
if (dropEventNotHandled(dragevent)) {
view.setVisibility(View.VISIBLE);
}
break;
default:
break;
}
return true;
}
private boolean dropEventNotHandled(DragEvent dragEvent) {
return !dragEvent.getResult();
}
};
findViewById(R.id.arrow_up).setOnTouchListener(myOnTouchListener);
findViewById(R.id.arrow_down).setOnDragListener(myDragListener);