studio 自定义view 圆形 跟鼠标移动
程序员文章站
2024-03-04 08:28:05
...
<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代表自己处理事件
}
}