studio 自定义view 圆形 跟鼠标移动

这里写图片描述

这里写图片描述

<resources>
//Theme.AppCompat.Light.NoActionBar"去掉标题
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>




package com.bawei.com.day03.Views;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by lenovo on 2017/12/26.
 */
//构造方法,一般会重写三个
//用于初始化一些数据,或者其他东西
public class Myviews extends View {

    private Paint paint;
    private int lastX;
    private int lastY;
    private int bottom;
    private int w;
    private int h;
    int statusBarHeight1 = -1;

    public Myviews(Context context) {
        this(context, null);
    }

    public Myviews(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public Myviews(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //初始化画笔
        //抗锯齿Paint.ANTI_ALIAS_FLAG 让图看起来更真实
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.BLUE);//设值颜色
        paint.setStrokeWidth(3);//设值画笔粗细
        //获取模拟器的这个矩形
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        //回去矩形的宽
        w = displayMetrics.widthPixels;
        //回去矩形的高
        h = displayMetrics.heightPixels;
        //获取status_bar_height资源的ID  获取状态栏的高度
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            //根据资源ID获取响应的尺寸值
            statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);
        }
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawCircle(75, 75, 50, paint);
        paint.setColor(Color.LTGRAY);
        //实例化路径
//        Path path = new Path();
//        path.moveTo(80, 200);// 此点为多边形的起点
//        path.lineTo(120, 250);
//        path.lineTo(80, 250);
//        path.close(); // 使这些点构成封闭的多边形
//        canvas.drawPath(path, paint);

    }

    //拖动事件
    //拖动的实现原理:

    /**
     * 每个View在屏幕上都有个坐标,也就是上下左右边距,在屏幕上都有(x,y)坐标。如果坐标移动,那么View的位置也会移动
     * ,这是比较好理解的。
     * 我们手指在手机屏幕上滑动的时候,手指的坐标也是移动的。
     * 我们只需要获得手指从按下到离开过程中的距离差,然后将距离差加到原来的坐标上就可以是实现控件的移动。
     * 如果要实现拖动,那么在滑动的过程中,不断的获取距离差,不断的加到原来的坐标就可以了。
     * 注意:
     * 这里的移动是相对于屏幕的,所以我们获取坐标应该是绝对坐标,而不是相对坐标
     * event.getRawX() ---- 获取绝对X坐标
     * event.getRawY() ---- 获取绝对Y坐标
     * <p>
     * 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 rawX = (int) event.getRawX();
                int rawY = (int) event.getRawY();
                //减去手指按下时候的坐标
                //得到移动的间距
                int dx = rawX - lastX;
                int dy = rawY - lastY;
                //原来的坐标
                int left = getLeft();
                int right = getRight();
                int bottom = getBottom();
                int top = getTop();
                //将间距,加到原来的坐标(上下左右)
                left = left + dx;
                right = right + dx;
                bottom = bottom + dy;
                top = top + dy;
                //判断
                if (left < 0) {
                    left = 0;
                    right = getWidth();
                }
                if (top < 0) {
                    top = 0;
                    bottom = getWidth();
                }
                if (right > w) {
                    right = w;
                    left = w - getWidth();
                }
                //如果移动到最下边,就判断是否等于屏幕高度减去状态栏高度
                if (bottom > h - statusBarHeight1) {
                    //赋值
                    bottom = h - statusBarHeight1;
                    top = bottom - getHeight();
                }
                //重新赋值给布局
                layout(left, top, right, bottom);//规定了View的位置
                //将lastX,lastY重新赋值
                lastX = rawX;
                lastY = rawY;
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return true;//返回true代表自己处理事件
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值