Android自定义控件-可拖动控制的圆环控制条

0
回复
112
查看
[复制链接]

2

主题

2

帖子

18

安币

初级码农

Rank: 1

发表于 2019-4-17 20:20:01 | 显示全部楼层 |阅读模式
如果对本篇文章感兴趣,请前往,原文地址:http://www.apkbus.com/blog-964610-79896.html

前几天收到这么一个需求,本来以为挺简单的,没想到最后发现实现起来还是有点小麻烦的,在这里小小的总结一下。先看看下面这张需求的样图:![样图](//upload-images.jianshu.io/upload_images/5362206-e91247fdb1bb977f.png)然后在看一下最终实现的效果图,可能是gif录制软件的问题,有一些浮影,忽略就好了:![最终demo图](//upload-images.jianshu.io/upload_images/5362206-be28cb508357ea9e.gif)首先要分析一下最核心的地方,如何获取到滑动距离对应的弧长,看图:![参考图](//upload-images.jianshu.io/upload_images/5362206-e023e1a02dc73085.png)p1是手指按下的点,很明显要想知道当前进度弧边的值,就是要求出角d的值。以p为圆心点,atan(b)=Math.atan((-p.y)/(-p.x));所以角d的值为:Math.toDegrees(atan);那么角b的值就得出来了,b=Math.toDegrees(atan)   mProgressOffest;图中的圆可以分为四个象限,同理可以得出四个象限中求得弧长的方法:```    /**     * 更新当前进度对应弧度     *     * @param x 按下x坐标点     * @param y 按下y坐标点     */    private void updateCurrentAngle(float x, float y) {        //根据坐标转换成对应的角度        float pointX = x - mCenterX;        float pointY = y - mCenterY;        float tan_x;//根据左边点所在象限处理过后的x值        float tan_y;//根据左边点所在象限处理过后的y值        double atan;//所在象限弧边angle        //01:第一象限-右上角区域        if (pointX >= 0 && pointY = 0) {            tan_x = pointX;            tan_y = pointY;            atan = Math.atan(tan_y / tan_x);//求弧边            mCurrentAngle = (int) Math.toDegrees(atan)   180.f   mProgressOffest;        }    }```获取手指按下的区域,避免误判断:```    /**     * 按下时判断按下的点是否按在圆环范围内     *     * @param x x坐标点     * @param y y坐标点     */    private boolean isTouchArc(float x, float y) {        double d = getTouchRadius(x, y);        return d >= mMinValidateTouchArcRadius && d = 0 && pointY = 0) {            if (((mLastQuadrant == 3 && mLastAngle == 359.f)                    || (mLastQuadrant == 3 && mLastAngle == 0.f))                    && mTouchQuadrant != 4)                return;            tan_x = pointX;            tan_y = pointY;            atan = Math.atan(tan_y / tan_x);//求弧边            mCurrentAngle = (int) Math.toDegrees(atan)   180.f   mProgressOffest;            mLastQuadrant = 4;        }        mLastAngle = mCurrentAngle;    }```其实做之前就真的觉得是挺简单的一个自定义控件,结果万万没想到因为最后这么一点代码折腾了半天。虽然最后这坨代码看着确实挺蛋疼的,但是暂时也想不到什么好的方法了,先这样吧。最后贴上完整代码:[https://github.com/Horrarndoo/CirqueControlView](https://github.com/Horrarndoo/CirqueControlView)  继续阅读全文



想在安卓巴士找到更多优质博文,可移步博客区

如果对本篇文章感兴趣,请前往,
原文地址:
http://www.apkbus.com/blog-964610-79896.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )