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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • c++报错无法打开文件_如何打开源文件

    c++报错无法打开文件_如何打开源文件一、无法打开文件“xxx.lib”出现这种错误一般为①未添加xxx.lib库文件②库添加后,路径不对,找不到对应的库文件路径解决方案:先查看库文件是否已经添加若未添加,右击项目->属性->链接器->输入;将库文件加入即可如果库文件已经添加,仍然报错,此时需要查看生成的库文件的路径了。先找到生成库文件的路径,右击项目->属性->常规->查看输出目录是否与生成的库文件的路径是否匹配,若不匹配,修改路径即可。二、无法打开源文件说明是库的附加包含路径有问题

    2022年10月21日
  • Java开发手册之单元测试

    Java开发手册之单元测试Java开发手册之单元测试

  • 京东金融大数据竞赛猪脸识别(3)- 图像特征提取之二

    京东金融大数据竞赛猪脸识别(3)- 图像特征提取之二深度网络既然在图像识别方面有很高的准确率,那将某一层网络输出数据作为图像特征也应该是可行的。该程序给出了使用Alexnet第七层作为激活层提取图像特征的示例。代码如下:clear;trainPath=fullfile(pwd,’image’);trainData=imageDatastore(trainPath,…’IncludeSubfolders’,true…

  • spring的aop思想_图片浏览器的设计与实现原理

    spring的aop思想_图片浏览器的设计与实现原理在上篇文章《Spring设计思想》AOP设计基本原理中阐述了SpringAOP的基本原理以及基本机制,本文将深入源码,详细阐述整个SpringAOP实现的整个过程。读完本文,你将了解到:1、Spring内部创建代理对象的过程2、SpringAOP的核心—ProxyFactoryBean3、基于JDK面向接口的动态代理JdkDynamicAopProxy生成代理对象4、基于Cglib子类继承方式的动态代理CglibAopProxy生成代理对象

  • 微信开放平台授权登录详细流程-第三方登录「建议收藏」

    微信开放平台授权登录详细流程-第三方登录「建议收藏」官方文档介绍的很详细,下面是看到的一篇博客,很有帮助,感谢!原文:https://blog.csdn.net/qq_34190023/article/details/81133619 据微信开放平台“开发资源”中网站应用微信登陆功能开发指南描述:进行授权登陆接入前,需要先注册一个开发者账号,并拥有一个已经审核通过的网站应用,并获取AppID和APPSecret,然后申请微信登陆并通过审核后…

  • Java经典算法(二)

    Java经典算法(二)【程序10】题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果n!=k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。解题代码:importjava.util.Scanner;publicclassTe

发表回复

您的电子邮箱地址不会被公开。

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