自定义控件_绘制太极(拖动)

自定义控件_绘制太极(拖动)packagecom.example.administrator.houzengyu_0417;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.graphics

大家好,又见面了,我是你们的朋友全栈君。



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);
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136189.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 常用jenkins插件汇总

    常用jenkins插件汇总1、ActiveChoicesPlug-in提供更多的参数展示方式,以及不同参数之间的动态关联2、ExtendedChoiceParameterPlug-In扩展参数值、默认值、参数说明的应用方式,可以从文件中获取3、Multijobplugin将已经创建的任务串行或并行,可以定义执行顺序以及参数传递4、PublishOverSSH通过ssh的方式向远端机器发送命令5、SCMAPIPlugin通过轮询方式检测版本库是否有更改,更改则触发构建…

    2022年5月5日
    65
  • [下载]Enterprise Library for .NET Framework 2.0正式版

    [下载]Enterprise Library for .NET Framework 2.0正式版

    2021年7月22日
    70
  • 傅立叶变换的物理意义

    1、为什么要进行傅里叶变换,其物理意义是什么?傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表

    2021年12月26日
    42
  • 推荐系统——LR模型「建议收藏」

    推荐系统——LR模型「建议收藏」LR模型是广义线性模型。LR模型(对数几率回归模型),虽然叫回归,但是其本质为分类。对数几率函数是一种sigmoid函数。线性模型有可解释性强、易于并行的优点。但是其难以表示非线性关系,所以模型的准确性可能不好。为了增强原始特征与拟合目标之间的非线性关系,通常需要对原始特征做一些非线性转换。常用的转换方法包括:连续特征离散化、特征之间的交叉等。离散化相当于把连续函数变成分段函数来增加非线性…

    2022年10月13日
    5
  • POJ2155:Matrix(二维树状数组,经典)「建议收藏」

    POJ2155:Matrix(二维树状数组,经典)

    2022年1月20日
    44
  • 配置windows怎么关闭计算机,准备配置WINDOWS,请勿关闭计算机。

    配置windows怎么关闭计算机,准备配置WINDOWS,请勿关闭计算机。图片发自简书App早上,想着在台式计算机机上面进行修改些文字,但是,开机后屏幕上一直就是打开电脑后的那一行字:准备配置WINDOWS,请勿关闭计算机。一直那样子。弄得,弄得我没有办法进入机内去修改了。这样,过于依赖的机器之后,有的时候也是一种很不好的事情。回想原来,笔墨时代,就会简单。过去时代,人们生活中依赖机器的事情,并不多,虽说“工欲善其事,必先利其器”,但是所谓的“器”,那时候,不外乎也是些…

    2022年6月26日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号