您的位置:首页 > 其它

自定义View,创建一个小圆点,单击可以拖动

2017-08-03 21:21 507 查看
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.xx.viewview.MainActivity">
//这里定义的是自定义的那个View继承的VIew的类
<com.xx.viewview.NewView//这里是你自定义VIew的包名+类名
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

</LinearLayout>
//自定义一个自定义View的类,继承View,在activity_main布局中应用

public class NewView extends View {
//画笔
private Paint paint;
//圆的半径
private float mRadius = 50f;
//圆的圆心的X坐标
private float paintx = mRadius;
//圆的圆心的Y坐标
private float painty = mRadius;
//判断是否可以移动  true是可以移动
private boolean moveable;

public NewView(Context context) {
super(context);
}

public NewView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//创建一个画笔
paint = new Paint();
//这是画笔的颜色
paint.setColor(Color.RED);
paint.setAntiAlias(true);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//根据圆心的坐标来绘制圆心的位置,而圆心的坐标在我们触摸屏幕的时候被我们修改了
canvas.drawCircle(paintx, painty, mRadius, paint);
}
//要单点拖动,保证手指在圆上的时候才移动,我们需要判断触摸的位置

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://按下的事件
float x = event.getX();//你当前点击的位置的X轴坐标
float y = event.getY();//你当前点击的位置的Y轴的坐标
/** 在手机屏幕边缘是有一层物理边缘,所以圆心的位置减去半径,总会和屏幕边缘有一点距离
*  x > paintx - mRadius  判断当前你点击的位置,是否大于 圆心的位置减去半径,如果大于则
*  证明你当前点击的位置在圆的左边缘里面,同时又不能超出圆的右边缘
*  x < paintx + mRadius 就是判断你当前点的X的位置有没有超出圆的右边缘,
*      如果你点击的X位置小于 圆心的位置+圆的半径,则证明没有抄错圆的右边缘
*
*  同理判断Y轴
*  y > painty -mRadius 判断当前你点击的位置的Y轴,大于 圆心减去半径,
*  则证明你点击的位置超过了圆的上边缘,同时不能超出圆的下边缘,
*  所以 判断 y < painty + mRadius 你点击的位置y轴不超过圆的下边缘,所以当前的Y轴位置
*  小于 圆心的位置加半径,则证明你点击的Y轴没有超过原的下边缘
*
*  就是判断你当前的位置在没在这个圆里面,如果在这个圆里面就可以拖动,在圆的外面不能拖动
*
*/
if (x > paintx - mRadius && x < paintx + mRadius && y > painty -
mRadius && y < painty + mRadius) {
//判断你触摸的位置如果在圆里面,让moveable变成true可以拖动
moveable = true;
Toast.makeText(getContext(), "我按下了", Toast.LENGTH_SHORT).show();
} else {
moveable = false;
}
break;
case MotionEvent.ACTION_MOVE://移动的事件
//如果是true的话可以移动,
//重新设置一下圆心的位置,把圆心的位置(paintx,painty)
//设置成我们当前触摸的位置(event.getX(),event.getY())
if (moveable) {
paintx = event.getX();
painty = event.getY();
//去重新绘制一个圆,会重新走onDraw()方法
invalidate();
Toast.makeText(getContext(), "我移动了", Toast.LENGTH_SHORT).show();
}
break;
case MotionEvent.ACTION_UP://抬起的事件
Toast.makeText(getContext(), "我抬起来了", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐