自定义View画圆及拖动
来源:互联网 发布:淘宝加拿大运费 编辑:程序博客网 时间:2024/05/29 02:35
activity_main
android:orientation="vertical"
Activity_Main
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
/**
* 自定义控件:
* 1.继承View
* 2.重写构造方法---初始化
* 3. 使用画笔在画布上绘制东西
* Paint Canvas
*
* 案例1:
* 画个圆
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Administrator on 2017/12/26 0026.
*/
public class MyCircle extends View {
private Paint paint;
//构造方法,一般会重写三个
//用于初始化一些数据,或者其他东西
public MyCircle(Context context) {
this(context,null);
}
public MyCircle(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public MyCircle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//初始化画笔
paint = new Paint();
//设置画笔
paint.setColor(Color.RED);//画笔的颜色
paint.setStrokeWidth(3);//画笔的粗细
}
//重写绘制的方法
@Override
protected void onDraw(Canvas canvas) {//参数:画布
super.onDraw(canvas);
//设置样式:比如描边
paint.setStyle(Paint.Style.STROKE);
//案例一:绘制一个简单的圆
canvas.drawCircle(100,100,50,paint);
paint.setColor(Color.BLUE);
canvas.drawCircle(120,120,50,paint);
}
}
MyCircle2
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by Administrator on 2017/12/26 0026.
*/
public class MyCircle2 extends View {
private Paint mPaint;
private int lastX;
private int lastY;
public MyCircle2(Context context) {
this(context,null);
}
public MyCircle2(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public MyCircle2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿
mPaint.setColor(Color.BLUE);
mPaint.setStrokeWidth(3);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(100,100,100,mPaint);
}
//拖动事件
//拖动的实现原理:
/**
* 每个View在屏幕上都有个坐标,也就是上下左右边距,在屏幕上都有(x,y)坐标。如果坐标移动,那么View的位置也会移动
* ,这是比较好理解的。
* 我们手指在手机屏幕上滑动的时候,手指的坐标也是移动的。
* 我们只需要获得手指从按下到离开过程中的距离差,然后将距离差加到原来的坐标上就可以是实现控件的移动。
* 如果要实现拖动,那么在滑动的过程中,不断的获取距离差,不断的加到原来的坐标就可以了。
* 注意:
* 这里的移动是相对于屏幕的,所以我们获取坐标应该是绝对坐标,而不是相对坐标
* event.getRawX() ---- 获取绝对X坐标
* event.getRawY() ---- 获取绝对Y坐标
*
* 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 mX = (int) event.getRawX();
int dx = mX-lastX;
int mY = (int) event.getRawY();
int dy = mY-lastY;
//将间距,加到原来的坐标(上下左右)
int l = getLeft();
int r = getRight();
int t = getTop();
int b = getBottom();
l = l+dx;
r = r+dx;
t = t+dy;
b=b+dy;
//判断
// if (l<0){
// l = 0;
// r = getWidth();
// }
//重新赋值给布局
layout(l,t,r,b);//规定了View的位置
//将lastX,lastY重新赋值
lastX = mX;
lastY = mY;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;//返回true代表自己处理事件
}
}