一.自己建一个类 继承 view
//注意:继承 View public class MyView extends View { private Paint mpaint; private int mWidth; private int mHeight; //注意手动改成 this // this代表调本类种的方法 // super调用父类的 // 直接new处理 public MyView(Context context) { this(context, null); } public MyView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //初始化东西 // 画笔画布,颜色,粗细。。。 mpaint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿 mpaint.setColor(Color.BLUE); mpaint.setStrokeWidth(5); } // 初始化一个画布 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 利用onMeasure方法测量长度 int cx = mWidth / 2; int cy = mHeight / 2; // 圆的半径 int radius = mWidth / 2; canvas.drawCircle(cx, cy, radius, mpaint);//mpaint代表画笔 } //利用 onMeasure 测量长度和宽度 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mWidth = getMeasuredWidth(); mHeight = getMeasuredHeight(); } //注意是int类型 int x; int y; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { // 按下 case MotionEvent.ACTION_DOWN: x = (int) event.getRawX();//绝对坐标 y = (int) event.getRawY(); break; // 滑动 case MotionEvent.ACTION_MOVE: int x1 = (int) event.getRawX(); int y1 = (int) event.getRawY(); //得到距离差 int dx = x1 - x; int dy = y1 - y; //从新赋值 int nL = getLeft() + dx; int t = getTop() + dy; int r = getRight() + dx; int b = getBottom() + dy; //确定位置 layout(nL, t, r, b); //给x y 重新赋值 x = (int) event.getRawX(); y = (int) event.getRawY(); break; // 抬起 case MotionEvent.ACTION_UP: x = (int) event.getRawX(); y = (int) event.getRawY(); break; } return true;//自己消费了这个事件 } } 二. 在 activity_main 里面写入<!--调用刚才自己写的 MyView 方法-->//主方法类中不需要写东西<!--注意:看好 MyView 的路径-->
<com.example.aaa.MyView android:id="@+id/mmmm" android:layout_width="200dp" android:layout_height="200dp" android:background="#0F0" />