拖球

public class MyCircle2 extends View {
 private Paint mPaint;
 private int lastX;
 private int lastY;
 public MyCircle2(Context context) {
  this(context,null);
 }
 public MyCircle2(Context context, @Nullable AttributeSet attrs) {
  this(context, attrs,0);
 }
 public MyCircle2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿
  mPaint.setColor(Color.BLUE);
  mPaint.setStrokeWidth(3);
 }
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  canvas.drawCircle(100,100,100,mPaint);
 }
 //拖动事件
 //拖动的实现原理:
/**
 * 每个View在屏幕上都有个坐标,也就是上下左右边距,在屏幕上都有(x,y)坐标。如果坐标移动,那么View的位置也会移动
 * ,这是比较好理解的。
 * 我们手指在手机屏幕上滑动的时候,手指的坐标也是移动的。
 * 我们只需要获得手指从按下到离开过程中的距离差,然后将距离差加到原来的坐标上就可以是实现控件的移动。
 * 如果要实现拖动,那么在滑动的过程中,不断的获取距离差,不断的加到原来的坐标就可以了。
 * 注意:
 *  这里的移动是相对于屏幕的,所以我们获取坐标应该是绝对坐标,而不是相对坐标
 *  event.getRawX() ---- 获取绝对X坐标
 *  event.getRawY() ---- 获取绝对Y坐标
 *
 *  event.getX()-------- 获取相对坐标x
 *  event.getY()-------- 获取相对坐标Y
 *
  */
 // onTouchEvent 处理触摸事件
 //Touch事件:1.按下ACTION_DOWN,2.抬起ACTION_UP,3 滑动 ACTION_MOVE 4.取消ACTION_CANCEL
 //获取触摸点的坐标
 //绝对坐标---相对于屏幕来说
 //相对坐标---相对于自己
 //event.getAction()   获取事件
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()){
   case MotionEvent.ACTION_DOWN:
    //获取开始的坐标
    lastX = (int) event.getRawX();
    lastY = (int) event.getRawY();
    break;
   case MotionEvent.ACTION_MOVE:
    //获取移动时候的坐标
    //减去手指按下时候的坐标
    //得到移动的间距
    int mX = (int) event.getRawX();
    int dx = mX-lastX;
    int mY = (int) event.getRawY();
    int dy = mY-lastY;
    //将间距,加到原来的坐标(上下左右)
    int l = getLeft();
    int r = getRight();
    int t = getTop();
    int b = getBottom();
    l = l+dx;
    r = r+dx;
    t = t+dy;
    b=b+dy;
    //判断
//    if (l<0){
//     l = 0;
//     r = getWidth();
//    }
    //重新赋值给布局
    layout(l,t,r,b);//规定了View的位置
    //将lastX,lastY重新赋值
    lastX = mX;
    lastY = mY;
    break;
   case  MotionEvent.ACTION_UP:
    break;
  }
  return true;//返回true代表自己处理事件
}
布局
  <com.gjl.day03.views.MyCircle2
        android:layout_width="200dp"
        android:layout_height="200dp"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值