我有一个服务可以创建一个带有 ImageView 对象的窗口,该对象有一个 onDragListener。 这个想法是能够在屏幕上重新定位该窗口。
问题: 无论出于何种原因,event.getX() 和 event.getY() 返回的坐标似乎并不反射(reflect)现实。该对象确实移动,但仅在左上角 70-100 像素左右并且非常不稳定。在模拟器和 Galaxy S5 上测试。
public class PlayerRemote extends Service
implements OnClickListener, OnDragListener{
private WindowManager windowManager;
private ImageView remoteButton;
String msg = "Sharp";
private static final String IMAGEVIEW_TAG = "Sharp";
private WindowManager.LayoutParams layoutParams;
public static final String ACTION_SWITCH_VIEW =
"com.example.android.playerremote.action.SWITCH_VIEW";
@Override public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
remoteButton = new ImageView(this);
remoteButton.setImageResource(R.drawable.on_off_inv);
remoteButton.setTag(IMAGEVIEW_TAG);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = display.getWidth();
params.y = display.getHeight();
windowManager.addView(remoteButton, params);
//------------------------------------------------------
//-SETTING OnLongClickListener--------------------------
/***/
remoteButton.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence)v.getTag());
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData(v.getTag().toString(), mimeTypes, item);
// Instantiates the drag shadow builder.
View.DragShadowBuilder myShadow = new DragShadowBuilder(remoteButton);
// Starts the drag
v.startDrag(dragData, // the data to be dragged
myShadow, // the drag shadow builder
null, // no need to use local data
0 // flags (not currently used, set to 0)
);
return true;
}
});
//------------------------------------------------------------------
//-SETTING OnDragListener-------------------------------------------
/***/
remoteButton.setOnDragListener( new OnDragListener(){
//@Override
public boolean onDrag(View v, DragEvent event){
switch(event.getAction())
{
case DragEvent.ACTION_DRAG_STARTED:
layoutParams = (LayoutParams) v.getLayoutParams();
break;
case DragEvent.ACTION_DRAG_ENTERED:
break;
case DragEvent.ACTION_DRAG_EXITED :
break;
case DragEvent.ACTION_DRAG_LOCATION :
Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION");
layoutParams.x = (int) Math.round(event.getX());
layoutParams.y = (int) Math.round(event.getY());
windowManager.updateViewLayout(remoteButton, layoutParams);
break;
case DragEvent.ACTION_DRAG_ENDED :
break;
case DragEvent.ACTION_DROP:
Log.d(msg, "ACTION_DROP event");
layoutParams.x = (int) Math.round(event.getX());
layoutParams.y = (int) Math.round(event.getY());
windowManager.updateViewLayout(remoteButton, layoutParams);
break;
default: break;
}
return true;
}
});
似乎当我改变 View 的重力时,我的拖放操作开始在不同的位置出现错误,并且仍然不允许我在屏幕上移动。感觉我的窗口被封装在另一个我不知道的对象中。
非常感谢任何想法。
最佳答案
通过膨胀布局并向其添加 ImageView 来解决问题,如下所示:
public class Remote extends Service
...
private WindowManager windowManager;
private ImageView remoteButton;
private RelativeLayout remoteButtonLayout;
...
[in onCreate()]
...
remoteButtonLayout = (RelativeLayout) inflater
.inflate(R.layout.remote_button, null);
remoteButton = (ImageView)remoteButtonLayout.findViewById(R.id.on_off_inv);
windowManager.addView(remoteButtonLayout, params);
OnClickListener 然后设置为布局而不是 ImageView 本身。 我觉得我错过了它,但不确定您是否需要布局而无需其他 Activity 在其后面运行。哦,好吧,这是我生命中的两天,我再也回不来了,哈哈。
...
关于android - 拖放:ImageView 不会在屏幕上一直移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27396486/