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

自定义控件_绘制太极(拖动)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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ddos工具linux,DDoS常用工具大全[通俗易懂]

    ddos工具linux,DDoS常用工具大全[通俗易懂]网络攻防是发生在第五空间的对抗和战争。这是一个动态的过程,无论攻击者还是防御者都在实战中寻求进步。攻防双方的“兵器”就在这个战场中不断磨砺和进化。绿盟科技关注攻防的最新进展,为了帮助客户更好的对抗网络威胁,每个季度会推出最新的“DDoS兵器谱”,介绍DDoS工具的最新发展和变化。1.简介本期“DDoS兵器谱”将要介绍的这三款工具的最新进展,他们是XOIC、Zarp和Slowhttptest。其中…

    2022年8月29日
    2
  • win10 命令行进入指定目录方法[通俗易懂]

    win10 命令行进入指定目录方法[通俗易懂]原文地址:https://blog.csdn.net/weixin_29207913/article/details/106616959方法一在资源管理器”地址“前面输入cmd。如下图:确认后cmd就会进入相关目录,进行其他cmd操作。如下图:方法二在资源管理器中,按住shift,同时右键空白地方,将会出现分别点击红框中选项,能分别使用PowerShell和WSL进入对应目录…

    2022年10月16日
    1
  • Pycharm设置点击无反应解决办法+Pycharm汉化「建议收藏」

    Pycharm设置点击无反应解决办法+Pycharm汉化「建议收藏」Pycharm汉化后会遇到设置点击无反应的情况。解决办法:1,如果你的lib文件下有汉化包“resources_ch.jar”直接删除就可以了。不过汉化就没了。2,删除原来的汉化包,更换汉化包。把“resources_zh_CN_PyCharm_2019.1_r1.jar”复制到lib文件夹下,记着不需要重命名。附亲测有效的汉化包:链接:https://pan.baidu.c…

    2022年5月20日
    98
  • Java集合篇:HashMap 与 ConcurrentHashMap 原理总结

    Java集合篇:HashMap 与 ConcurrentHashMap 原理总结一、HashMap原理总结:1、什么是HashMap:(1)HashMap是基于Map接口的非同步实现,线程不安全,是为了快速存取而设计的;它采用key-value键值对的形式存放元素(并封装成Node对象),允许使用null键和null值,但只允许存在一个键为null,并且存放在Node[0]的位置,不过允许存在多个value为null的情况。(2)在JDK7及之前的版本,HashMap的数据结构可以看成“数组+链表”,在JDK8及之后的版本,

    2022年6月24日
    20
  • mysql5.7 是否支持partition分区?

    mysql5.7 是否支持partition分区?

    2022年2月10日
    48
  • 最小二乘法求回归直线方程的推导过程

    最小二乘法求回归直线方程的推导过程在数据的统计分析中,数据之间即变量x与Y之间的相关性研究非常重要,通过在直角坐标系中做散点图的方式我们会发现很多统计数据近似一条直线,它们之间或者正相关或者负相关。虽然这些数据是离散的,不是连续的,我们无法得到一个确定的描述这种相关性的函数方程,但既然在直角坐标系中数据分布接近一条直线,那么我们就可以通过画直线的方式得到一个近似的描述这种关系的直线方程。当然,从前面的描述中不难看出,所有数据都分布

    2022年5月16日
    41

发表回复

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

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