Android graphics画图的点击事件处理
16lz
2021-01-23
- packagecom.jacp.test;
- importAndroid.app.Activity;
- importAndroid.content.Context;
- importAndroid.graphics.Canvas;
- importAndroid.graphics.Color;
- importAndroid.graphics.Paint;
- importAndroid.graphics.Rect;
- importAndroid.graphics.RectF;
- importAndroid.os.Bundle;
- importAndroid.util.DisplayMetrics;
- importAndroid.view.MotionEvent;
- importAndroid.view.View;
- importAndroid.widget.Toast;
- publicclassDrawSimpleCircleextendsActivity{
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- DisplayMetricsmetrics=newDisplayMetrics();
- this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
- //屏幕的分辨率
- intwidth=metrics.widthPixels;
- intheight=metrics.heightPixels;
- setContentView(newMyCircle(this,width,height));
- }
- classMyCircleextendsView{
- privateContextcontext;
- /**
- *屏幕的宽
- */
- privateintwidth;
- /**
- *屏幕的高
- */
- privateintheight;
- /**
- *颜色区分区域
- */
- privateint[]colors=newint[]{Color.BLACK,Color.BLUE,Color.CYAN,
- Color.GREEN,Color.GRAY,Color.MAGENTA,Color.RED,Color.LTGRAY};
- privateString[]colorStrs=newString[]{
- "黑色","蓝色","青绿色","绿色","灰色","洋红色","红色","浅灰色"};
- /**
- *大园半径
- */
- privatefloatbigR;
- /**
- *小圆半径
- */
- privatefloatlitterR;
- /**
- *屏幕中间点的X坐标
- */
- privatefloatcenterX;
- /**
- *屏幕中间点的Y坐标
- */
- privatefloatcenterY;
- publicMyCircle(Contextcontext,intwidth,intheight){
- super(context);
- this.context=context;
- this.width=width;
- this.height=height;
- setFocusable(true);
- System.out.println("width="+width+"<---->height="+height);
- //设置两个圆的半径
- bigR=(width-20)/2;
- litterR=bigR/2;
- centerX=width/2;
- centerY=height/2;
- }
- @Override
- protectedvoidonDraw(Canvascanvas){
- //画背景颜色
- Paintbg=newPaint();
- bg.setColor(Color.WHITE);
- RectbgR=newRect(0,0,width,height);
- canvas.drawRect(bgR,bg);
- floatstart=0F;
- Paintpaint=newPaint(Paint.ANTI_ALIAS_FLAG);
- for(inti=0;i<4;i++){
- //注意一定要先画大圆,再画小圆,不然看不到效果,小圆在下面会被大圆覆盖
- //画大圆
- RectFbigOval=newRectF(centerX-bigR,centerY-bigR,
- centerX+bigR,centerY+bigR);
- paint.setColor(colors[i]);
- canvas.drawArc(bigOval,start,90,true,paint);
- //画小圆
- RectFlitterOval=newRectF(centerX-litterR,centerY-litterR,
- centerX+litterR,centerY+litterR);
- paint.setColor(colors[i+2]);
- canvas.drawArc(litterOval,start,90,true,paint);
- start+=90F;
- }
- super.onDraw(canvas);
- }
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- //获取点击屏幕时的点的坐标
- floatx=event.getX();
- floaty=event.getY();
- whichCircle(x,y);
- returnsuper.onTouchEvent(event);
- }
- /**
- *确定点击的点在哪个圆内
- *@paramx
- *@paramy
- */
- privatevoidwhichCircle(floatx,floaty){
- //将屏幕中的点转换成以屏幕中心为原点的坐标点
- floatmx=x-centerX;
- floatmy=y-centerY;
- floatresult=mx*mx+my*my;
- StringBuildertip=newStringBuilder();
- tip.append("您点击了");
- //高中的解析几何
- if(result<=litterR*litterR){//点击的点在小圆内
- tip.append("小圆的");
- tip.append(colorStrs[whichZone(mx,my)+2]);
- tip.append("区域");
- }elseif(result<=bigR*bigR){//点击的点在大圆内
- tip.append("大圆的");
- tip.append(colorStrs[whichZone(mx,my)]);
- tip.append("区域");
- }else{//点不在作作区域
- tip.append("作用区域以外的区域");
- }
- Toast.makeText(context,tip,Toast.LENGTH_SHORT).show();
- }
- /**
- *判断点击了圆的哪个区域
- *@paramx
- *@paramy
- *@return
- */
- privateintwhichZone(floatx,floaty){
- //简单的象限点处理
- //第一象限在右下角,第二象限在左下角,代数里面的是逆时针,这里是顺时针
- if(x>0&&y>0){
- return0;
- }elseif(x>0&&y<0){
- return3;
- }elseif(x<0&&y<0){
- return2;
- }elseif(x<0&&y>0){
- return1;
- }
- return-1;
- }
- }
- }
更多相关文章
- APIDEMO ACTIVITY 屏幕在出现软键盘情况下自适应大小
- Android Screen Monitor抓取真机屏幕
- android锁屏唤醒并解锁屏幕
- Android屏幕自适应详解
- android View的快照与屏幕的截屏
- Android屏幕尺寸详解
- Qt on Android:怎样适应不同的屏幕尺寸
- Android 支持不同(本地化、屏幕、版本)设备