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

来源:互联网 发布:算法导论适合初学者吗 编辑:程序博客网 时间:2024/05/21 07:48
<?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;    }}
原创粉丝点击