android 可移动view,Android开发 DragView 可拖动的View/ImageView

package view;

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.widget.Scroller;

/**

* Created by abc on 2017/3/29.

*/

public class DragView extends View {

Scroller mScroller;

public DragView(Context context) {

super(context);

mScroller = new Scroller(context);

}

public DragView(Context context, AttributeSet attrs) {

super(context, attrs);

mScroller = new Scroller(context);

}

public DragView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mScroller = new Scroller(context);

}

public DragView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {

super(context, attrs, defStyleAttr, defStyleRes);

mScroller = new Scroller(context);

}

int lastX, lastY, offsetX, offsetY;

@Override

public boolean onTouchEvent(MotionEvent event) {

int x = (int) event.getX();

int y = (int) event.getY();

//2

int rawX = (int) event.getRawX();

int rawY = (int) event.getRawY();

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

lastX = rawX;

lastY = rawY;

break;

case MotionEvent.ACTION_MOVE:

offsetX = rawX - lastX;

offsetY = rawY - lastY;

// offsetX = x - lastX;

// offsetY = y - lastY;

// offsetLeftAndRight(offsetX);

// offsetLeftAndRight(offsetY);

layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);

Log.e("lyf", " " + getLeft() + offsetX + " " + getTop() + offsetY + " " + getRight() + offsetX + " " + getBottom() + offsetY);

lastX = rawX;

lastY = rawY;

break;

case MotionEvent.ACTION_UP:

View viewGroup = (View) getParent();

mScroller.startScroll(viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX(), -viewGroup.getScrollY());

invalidate();

break;

}

return true;

}

@Override

public void layout(int l, int t, int r, int b) {

super.layout(l, t, r, b);

}

@Override

public void computeScroll() {

super.computeScroll();

//判断Scroller是否执行完毕

if (mScroller.computeScrollOffset()) {

((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());

//通过重绘来不断调用computeScroll

invalidate();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值