博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android开发学习 ------- 自定义View 圆 ,其点击事件 及 确定当前view的层级关系
阅读量:5887 次
发布时间:2019-06-19

本文共 4883 字,大约阅读时间需要 16 分钟。

我需要实现下面的效果:   参考文章:

涉及的View事件分发机制   (最全面的原理性文章)

      

点击绿色的圆 - Toast ("点击大圆的区域")

点击黄色的圆 - Toast ("点击小圆的区域")

点击两个圆以外的区域 - Toast ("点击圆以外的区域")

 

/**  * Created by lemon on 2018/3/28.  * 自定义圆形  */ public class MyCircle extends View{
private Context context; /** * 屏幕的宽 */ private int width; /** * 屏幕的高 */ private int height; /** * 大圆的半径 */ private float bigR; /** * 小圆的半径 */ private float litterR; /** * 屏幕中间点的X坐标 - 小圆 大圆 圆心的x坐标 */ private float centerX,centerXlittle; /** * 屏幕中间点的Y坐标 - 小圆 大圆 圆心的y坐标 */ private float centerY,centerYlittle; /** *构造函数,由调用此类的的context传递width height */ public MyCircle(Context context, int width, int height) {
super(context); this.context = context ; this.width = width ; this.height = height ; setFocusable(true); //Toast.makeText(context,"width="+width+"<---->height="+height,Toast.LENGTH_SHORT).show(); //设置两个圆的半径 bigR = (width - 100)/4; litterR = bigR/2; //屏幕的中点-大圆的中心坐标 centerX = width/2; centerY = height/2; //小圆的中心坐标 centerXlittle = centerX + bigR ; centerYlittle = centerY + bigR - 120; } /** *绘制两个圆的情况 */ @Override protected void onDraw(Canvas canvas) {
//画背景颜色 /*Paint bg = new Paint(); bg.setColor(Color.WHITE); Rect bgR = new Rect(0,0,width,height); canvas.drawRect(bgR,bg);*/ //float start = 0F; Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);// 构建Paint时直接加上去锯齿属性 //我们一共画两个圆 for(int i=0 ; i<2 ; i++){
/** * 第一种是用圆弧来画一个圆 在android中Rect和RextF都是用来创建一个矩形的 Rect的参数是int型 ,RectF的参数是float型. 根据中心点 来确定上下左右 的矩形 RectF bigOval = new RectF(centerX - bigR,centerY - bigR,centerX + bigR, centerY + bigR); // drawArc - 画圆弧 // 第一个参数定义的圆弧的形状和大小的范围 // 第二个参数的作用是设置圆弧是从哪个角度来顺时针绘画的 // 第三个参数 这个参数的作用是设置圆弧扫过的角度 // 第四个参数 这个参数的作用是设置我们的圆弧在绘画的时候,是否经过圆形 // 第五个参数 这个参数的作用是设置我们的画笔对象的属性 paint.setColor(Color.GREEN); canvas.drawArc(bigOval,start,360,true,paint); */ /** * 第二种可以直接画出圆 */ paint.setColor(Color.GREEN); //(圆心x0,圆心y0,半径,paint) canvas.drawCircle(centerX,centerY,bigR,paint); /* RectF littleOval = new RectF(centerXlittle - litterR,centerYlittle - litterR, centerXlittle + litterR, centerYlittle + litterR); paint.setColor(Color.YELLOW); canvas.drawArc(littleOval,start,360,true,paint);*/ paint.setColor(Color.YELLOW); //(圆心x0,圆心y0,半径,paint) canvas.drawCircle(centerXlittle,centerYlittle,litterR,paint); } super.onDraw(canvas); } /** * View类的dispatchTouchEvent()方法默认实现就是能帮你调用View自己的onTouchEvent方法 */ @Override public boolean dispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);//默认实现,可以不写 } /** * 如果View想处理事件,则view设置为clickable 或 复写 onTouchEvent(),return true; */ @Override public boolean onTouchEvent(MotionEvent event) {
//获取点击屏幕时的点的坐标 float x = event.getX(); float y = event.getY(); whichCircle(x,y); return true;//返回true,代表事件已经消费,事件已经终止。 // return false; 调用父类的onTouchEvent() // return super.onTouchEvent(event); } /** * 确定点击的点在哪个圆内 */ private void whichCircle(float x,float y){
//将屏幕中的点转换成以屏幕中心为原点的坐标点 float mx = x - centerX; float my = y - centerY; float result = mx*mx + my*my ; float lx = x - centerXlittle; float ly = y - centerYlittle; float resultlittle = lx*lx + ly *ly; if(resultlittle <= litterR*litterR){
Toast.makeText(context,"点击了小圆的区域",Toast.LENGTH_SHORT).show(); }else if(result <= bigR*bigR){
Toast.makeText(context,"点击了大圆的区域",Toast.LENGTH_SHORT).show(); }else{
Toast.makeText(context,"点击了圆以外的区域",Toast.LENGTH_SHORT).show(); } } }
public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);      //  setContentView(R.layout.activity_main);        DisplayMetrics metrics = new DisplayMetrics();        this.getWindowManager().getDefaultDisplay().getMetrics(metrics);        //屏幕的分辨率        int width = metrics.widthPixels;        int height = metrics.heightPixels;        setContentView(new MyCirclebig(this,width,height));    }}

 

确定当前view的层级关系

 

转载于:https://www.cnblogs.com/mengxiao/p/8671415.html

你可能感兴趣的文章
CF989B A Tide of Riverscape 思维 第七题
查看>>
unix高级环境编程-读书笔记(1)
查看>>
MongoDB学习教程(1)
查看>>
基于adt-bundle-windows-x86-20140321的android环境搭建
查看>>
Jquery遮罩ShowLoading组件
查看>>
pivot 使用
查看>>
hdu 1180 诡异的楼梯 BFS + 优先队列
查看>>
quartz
查看>>
hadoop中mapreduce的mapper抽象类和reduce抽象类
查看>>
【HAOI2006】【BZOJ1051】【p1233】最受欢迎的牛
查看>>
dedecms的安装,request_order的问题
查看>>
PHP遍历文件夹下的文件和获取到input name的值
查看>>
JavaScript对象属性(二)
查看>>
vi 颜色配置
查看>>
模块划分--MVVM指南(课程学习)
查看>>
中南大学2014年数据结构考试真题及(个人解答)答案
查看>>
Educational Codeforces Round 63-D(基础DP)
查看>>
gradle
查看>>
wcf服务契约的重载
查看>>
数据帮助类DBhelper的定义
查看>>