自定义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);
}
}



MyCircle


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代表自己处理事件
}
}

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 死飞车的牌子 死飞车链条 死飞车架子 死飞车24寸 什么叫死飞车 死飞车安全吗 死飞车怎么骑 死飞车卡片 死忙飞车 死飞车组装 死飞车好骑吗 死飞车漂移 什么是死飞车 为什么叫死飞车 死飞车车锁 死飞车前叉 死飞车自行车 死飞车把安装 美利达死飞车 死飞车把绑带 死飞车论坛 死飞车怎么打气 死飞车改装 死飞车坐垫 死飞车好不好骑 捷安特死飞车 二手死飞车 死飞车内胎 qq飞车死一样的痛过 qq飞车卡死 望山跑死马下一句 死魂曲 ps3 死魂曲 死魂曲1下载 死魂曲下载 死魂盒 美国死魂盒的真实故事 肿眼泡割了双眼皮想死 恐怖之眼无敌不死版 灭世法则 死鱼眼 死鱼眼是什么样子的