自定义控件_点击圆球移动
效果
自定义View类
package com.example.administrator.myapplication04;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
/**
* data:2018/05/14.
* author : 殷成龙(Administrator)
* function :
*/
public class MyView extends View {
private Paint paint;
private int x;
private int y;
private int downX;
private int downY;
// private boolean dianji;
// private boolean yidong;
private boolean minitview;
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);
//创建一个画笔
paint = new Paint();
}
//定义圆点的坐标
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
x = this.getWidth() / 2;
y = this.getHeight() / 2;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画笔颜色
paint.setColor(Color.BLUE);
//屏幕为白色
canvas.drawColor(Color.BLACK);
//x,y是圆球的中心点radius是圆的半径
canvas.drawCircle(x,y,38,paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
downX = (int) event.getX();
downY = (int) event.getY();
minitview = initview(x, y);
break;
case MotionEvent.ACTION_MOVE:
if (minitview){
x = (int) event.getX();
y = (int) event.getY();
invalidate();
}
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
private boolean initview(int downX, int downY) {
int absx = Math.abs(this.downX - x);
int absy = Math.abs(this.downY - y);
int asd = absx * absx + absy * absy;
if (asd<=38*38){
return true;
}
return false;
}
// @Override
// public boolean onTouchEvent(MotionEvent event) {
// switch (event.getAction()){
// //获得点击时圆点的坐标
// case MotionEvent.ACTION_DOWN:
// x =(int) event.getX();
// y =(int) event.getY();
// dianji = true;
// yidong = false;
// break;
// //移动时圆点的坐标
// case MotionEvent.ACTION_MOVE:
//
// if (dianji){
// yidong = true;
// x =(int) event.getX();
// y =(int) event.getY();
// }
//
// break;
// //松开时圆点的坐标
// case MotionEvent.ACTION_UP:
// x =(int) event.getX();
// y =(int) event.getY();
// break;
// }
// //判断只有点击到圆球上时才能移动
// if (dianji&&yidong){
// //判断不能移出屏幕
// if (x >= 10 && y >=10 && x<this.getWidth()-10&&y<this.getHeight()-10){
// //进行时时回掉
// postInvalidate();
// }
//
// }
//
// return true;
//
// }
}
主页面
package com.example.administrator.myapplication04;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout rl = findViewById(R.id.rl);
MyView myView = new MyView(this);
rl.addView(myView);
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.example.administrator.myapplication04.MyView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mv"/>
</RelativeLayout>