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

自定义控件_绘制太极(拖动)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)
上一篇 2022年6月3日 下午11:36
下一篇 2022年6月3日 下午11:36


相关推荐

  • timestamp转化为date类型

    timestamp转化为date类型br SELECTto date to char ORDER CREATE DATE yyyy mm ddhh24 mi ss yyyy mm ddhh24 mi ss br FROMITSM ORDER

    2026年3月18日
    2
  • 什么是拉链表_女表拉链的

    什么是拉链表_女表拉链的原文地址:https://blog.csdn.net/xiepeifeng/article/details/42431027在数据仓库的数据模型设计过程中,经常会遇到这样的需求:1.数据量比较大;2.表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;3.需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,  比如,查看某一…

    2022年10月16日
    6
  • OpenClaw 安装指南(面向开发人员)

    OpenClaw 安装指南(面向开发人员)

    2026年3月13日
    3
  • 如何搭建一个聊天机器人?2 海豹骰速成

    如何搭建一个聊天机器人?2 海豹骰速成

    2026年3月14日
    2
  • 五子棋人机对战思路「建议收藏」

    五子棋人机对战思路「建议收藏」五子棋人机对战:人机对战,我们可以想象一下我们在玩QQ游戏五子棋时的场景,根据每次下的步骤来分析电脑是怎样解析我们下棋的步骤的。下五子棋的步骤:1、第一步,黑子先下2、白子的第一步的最好的位置就是在黑子周围的八个点上3、接着黑子的第二步必然也是根据白子周围的八个点和自己的黑子所在的位置来下。4、如此循环下去。。。。那么对于计算机来说,就是让他找到第一个黑子周围的八个点,并且随机选中一个下白子。…

    2022年6月16日
    188
  • 新发的日常小技巧——Sublime插件安装教程(例:lua开发环境插件安装)

    新发的日常小技巧——Sublime插件安装教程(例:lua开发环境插件安装)文章目录一、前言二、关于PackageControl三、安装PackageControl1、办法1:通过命令行安装(需联网)2、办法2:直接拷贝插件包文件到InstalledPackages目录四、通过PackageControl安装插件(需联网)五、无网络环境下安装插件六、lua开发环境插件安装一、前言Sublime具有良好的扩展能力,具有非常多好用的扩展插件,本文我教大家如何给Sublime安装插件。二、关于PackageControl我们要给Sublime安装插件,就需要先安装Pac

    2022年6月24日
    41

发表回复

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

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