自定义控件_绘制太极(拖动)
来源:互联网 发布:淘宝店铺的钱在哪里看 编辑:程序博客网 时间:2024/05/16 07:18
import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * Created by Administrator on 2017/4/17. */public class MyView extends View{ private static final String TAG = "TJView"; private int padding = 8; //画笔工具 private Paint mPaint; //圆心坐标 private float currentX = 0; private float currentY = 0; //大圆半径 private float radiusBig = 200; //中圆半径 private float radiusCenter = radiusBig / 2; //小圆半径 private float radiusSmall = radiusCenter / 3; private int width; private int height; private float distance; private final float increment = 10; private final float min = 50; public MyView(Context context) { this(context, null); } public MyView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); mPaint.setAntiAlias(true); // setAnimation(); } /** * 设置缩放动画 */ /*private void setAnimation() { ScaleAnimation scaleAnimation2 = new ScaleAnimation(0.7f, 1.0f, 0.7f, 1.0f, ScaleAnimation.RELATIVE_TO_PARENT, 0.5f, ScaleAnimation.RELATIVE_TO_PARENT, 0.5f); scaleAnimation2.setDuration(500);// 设置持续时间 scaleAnimation2.setRepeatCount(99999);// 设置重复次数 scaleAnimation2.setFillAfter(true);// 保持动画结束时的状态 startAnimation(scaleAnimation2); }*/ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawBg(canvas); drawLeftHalfCirle(canvas); drawTBCirle(canvas); } /** * 画上下两个圆--中圆和小圆 * * @param canvas */ private void drawTBCirle(Canvas canvas) { //画上面的白中圆 mPaint.setColor(Color.WHITE); canvas.drawCircle(currentX, currentY - radiusBig / 2, radiusCenter, mPaint); //画上面的黑小圆 mPaint.setColor(Color.BLACK); canvas.drawCircle(currentX, currentY - radiusBig / 2, radiusSmall, mPaint); //画下面的黑中圆 mPaint.setColor(Color.BLACK); canvas.drawCircle(currentX, currentY + radiusBig / 2, radiusCenter, mPaint); //画下面的白小圆 mPaint.setColor(Color.WHITE); canvas.drawCircle(currentX, currentY + radiusBig / 2, radiusSmall, mPaint); } /** * 画左边半圆 * * @param canvas */ private void drawLeftHalfCirle(Canvas canvas) { mPaint.setColor(Color.WHITE); canvas.drawArc(new RectF(currentX - radiusBig, currentY - radiusBig, currentX + radiusBig, currentY + radiusBig), 90, 180, true, mPaint);//90度开始画180度 } /** * 画黑色的背景底板 * * @param canvas */ private void drawBg(Canvas canvas) { mPaint.setColor(Color.BLACK); canvas.drawCircle(currentX, currentY, radiusBig + padding, mPaint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); currentX = MeasureSpec.getSize(widthMeasureSpec) / 2; currentY = MeasureSpec.getSize(heightMeasureSpec) / 2; setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); width = getWidth(); height = getHeight(); } @Override public boolean onTouchEvent(MotionEvent event) { /*currentX = event.getX(); currentY = event.getY(); invalidate(); return true;*/ //手指的数量 int count = event.getPointerCount(); float x = event.getX(); float y = event.getY(); int action = event.getAction(); if(action==MotionEvent.ACTION_POINTER_DOWN){ distance = getDistance(event); } if(count==1) { if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_MOVE) { if (x > width - radiusBig) { x = width - radiusBig; } else if (x < radiusBig) { currentX = radiusBig; } else { currentX = x; } if (y > height - radiusBig) { currentY = height - radiusBig; } else if (y < radiusBig) { currentY = radiusBig; } else { currentY = y; } postInvalidate(); } } else if(count==2&&action == MotionEvent.ACTION_MOVE){ float maxR = 0; if(currentX<currentY){ maxR = currentX; }else{ maxR = currentY; } //判断手指方向 if(distance>getDistance(event)){ radiusBig -= increment; if(radiusBig<min){ radiusBig = min; } }else if(distance<getDistance(event)){ radiusBig += increment; if(radiusBig>maxR){ radiusBig = maxR; }else if(radiusBig>width/2){ radiusBig = width/2; } } distance = getDistance(event); postInvalidate(); } return true; } private float getDistance(MotionEvent event){ float xOne = event.getX(0); float yOne = event.getY(0); float xTwo = event.getX(1); float yTwo = event.getY(1); return (xOne - xTwo)*(xOne - xTwo)+(yOne - yTwo)*(yOne - yTwo); }}
0 0
- 自定义控件_绘制太极(拖动)
- 自定义view绘制太极图案
- 自定义view 绘制太极案例
- 自定义控件的拖动
- 自定义控件的拖动
- 自定义控件的拖动
- 自定义View_绘制圆_进行拖动(不出屏幕)放大缩小
- Canvas绘制旋转太极
- html 绘制太极
- WTL绘制自定义控件
- android 绘制自定义控件
- android 绘制自定义控件
- 自定义View绘制圆,可拖动
- 自定义View-太极旋转
- 自定义控件_画圆
- 自定义控件_自定义日历
- 自定义绘制控件的方法
- MFC控件的自定义绘制
- 车牌自动识别 Automatic Number Plate Recognition(ANPR)-----第一话:原理介绍
- C++ explicit关键字详解
- [BZOJ]4690: Never Wait for Weights 带权并查集
- [BZOJ 3039]玉蟾宫:单调栈
- 使用Firstobject XML editer 更新Microsoft Point Power文档中的表格(charts)
- 自定义控件_绘制太极(拖动)
- Latex中点乘、叉乘、除以
- SpringMVC_文件上传
- 线程池的使用与底层实现机制
- 读《文明之光》吴军
- 设计模式-工厂模式
- 胶水命令
- 自定义View
- Linux内存管理之mmap详解