android 可拖动的小窗口
时间: 2023-10-30 15:05:57 浏览: 45
在 Android 上,可以通过创建一个可拖动的小窗口来实现类似于 Facebook Messager 聊天头像的效果。下面是一个简单的示例:
1. 创建一个自定义的 View,继承自 View 或其子类,例如 ImageView。
2. 在 onTouchEvent() 方法中,处理触摸事件,实现拖动功能。当用户按下手指时,记录下当前位置的坐标;当手指移动时,根据手指的移动量更新 View 的位置;当手指抬起时,停止拖动。注意要考虑边界问题,防止 View 超出屏幕范围。
3. 在布局文件中,使用 FrameLayout 或 RelativeLayout 等布局容器,将自定义的 View 添加进去。设置 View 的初始位置和大小。
4. 在 Activity 中,设置 WindowManager 的 LayoutParams,将 View 添加到 WindowManager 中并显示出来。
下面是代码示例:
```java
public class DragView extends ImageView {
private WindowManager mWindowManager;
private WindowManager.LayoutParams mLayoutParams;
private int mLastX, mLastY;
public DragView(Context context) {
super(context);
init();
}
public DragView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mWindowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
mLayoutParams = new WindowManager.LayoutParams();
mLayoutParams.width = 200;
mLayoutParams.height = 200;
mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
mLayoutParams.format = PixelFormat.TRANSLUCENT;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastX = (int) event.getRawX();
mLastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) (event.getRawX() - mLastX);
int dy = (int) (event.getRawY() - mLastY);
mLayoutParams.x += dx;
mLayoutParams.y += dy;
mWindowManager.updateViewLayout(this, mLayoutParams);
mLastX = (int) event.getRawX();
mLastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
public void show() {
mWindowManager.addView(this, mLayoutParams);
}
public void hide() {
mWindowManager.removeView(this);
}
}
```
在 Activity 中,可以通过如下方式显示和隐藏 DragView:
```java
DragView dragView = new DragView(this);
dragView.setImageResource(R.drawable.ic_launcher);
dragView.show();
// dragView.hide();
```