实现一个简单的android开关
近期在学习android中的graphics中绘图系列。依照大神思路。找葫芦画瓢实现了一个开关。如图下:
记录一下实现方式:
1.画背景
上图形状。分成两个半圆与一个矩形,那么代码能够写成:
private void drawBackground(Canvas canvas) {
mBackGroundPaint.setColor(mCurrentBackGroundColor);
//画右边的半圆
RectF recF = new RectF(mToggleWidth / 2 - mRadius, -mRadius, mToggleWidth / 2 + mRadius, mRadius);
canvas.drawArc(recF, -90, 180, true, mBackGroundPaint);
//画矩形
RectF tangle = new RectF(-mToggleWidth / 2, -mRadius, mToggleWidth / 2, mRadius);
canvas.drawRect(tangle, mBackGroundPaint);
//画左边的半圆
RectF rectF = new RectF(-mToggleWidth / 2 - mRadius, -mRadius, -mToggleWidth / 2 + mRadius, mRadius);
canvas.drawArc(rectF, 270, -180, true, mBackGroundPaint);
canvas.restore();
}
3.画圆点:
这里我是用一个圆环[紫色的]+内切圆环的实心圆[蓝色]构成的。或许你会说,直接设置panint.setStrokeWidth不就能够了。这个傻冒,呵呵。事实上我也想。可是发现不行啊【比較难看,并且我的颜色还不好设置,呵呵,你试一下就知道了】。
紫色的圆环负责显示包住内部实心圆,形成一个边界作用。这个对于白色的实心圆是非常好看的。
4.设置开关
public void setOpen(boolean isOpen) {
if (mIsOpen != isOpen) {
mIsOpen = isOpen;
showAnimation(mIsOpen);
}
}
能够看出。这里我用了动画的显示效果,在android横行的年代,不加点动画就会显示生硬。举个梨子,我第一个遇到哥们做相似的开关时。直接叫视觉project师[说白了就是美工]切了两张图,不得不说,那哥们非常聪明非常牛逼,我自然也是学到了,后来发现发现好生硬啊,没有一点美感。于是我就自己写了。
A.实心圆的圆心坐标:
图中能够看到非常清楚了。那么我能够直接写代码了:
//mToggleWidth正好是矩形的矩形的长度哦:
final float start = isOpen ? -mToggleWidth / 2 : mToggleWidth / 2;
float end = isOpen ?
mToggleWidth / 2 : -mToggleWidth / 2;
ValueAnimator animator = ValueAnimator.ofFloat(start, end);
animator.setDuration(mAnimationTime);
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
mCurrentXPosition = (float) valueAnimator.getAnimatedValue();
setCurrentColor();
invalidate();
}
});
animator.start();
}
B. 背景的变色:
从关闭颜色到打开颜色,这当中是有颜色过度的。不清楚,好你看看这个:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzc2MjU3Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title=""> 清楚了吧,恩这个颜色该怎么玩呢????
非常多大神的文章里,都是有个叫颜色估值器的介绍,即:
ValueAnimator.ofArgb(...)
本来用这个非常easy实现的,能够我练习的sdk min版本号是14,也真是懒得改,好吧,懒得改我就的想想方法了,方法是这种:
我在s点的坐标我是知道的,那么我就能够计算我动画运行的百分比了吧,恩,啥意思?:
float percent = (mCurrentXPosition + mToggleWidth / 2) * 1.0f / mToggleWidth;
这个看图能够直观些。我也就不多讲了,事实上我数学也非常不好,还特么刚学习Paint,也搞了好久,多搞搞或许就好了。知道了动画进行的百分比,那么我们就知道了随意时刻的动画了:
float percent = (mCurrentXPosition + mToggleWidth / 2) * 1.0f / mToggleWidth;
int currentR = (int) ((mEndBgColorR - mStartBgColorR) * percent + mStartBgColorR);
int currentG = (int) ((mEndBgColorG - mStartBgColorG) * percent + mStartBgColorG);
int currentB = (int) ((mEndBgColorB - mStartBgColorB) * percent + mStartBgColorB);
mCurrentBackGroundColor = Color.rgb(currentR, currentG, currentB);
这里的EndBgColor是指结束时的背景颜色。而StartBgColor就是指開始时的背景颜色。
使用:
xml文件里配置:
<micro.com.testpaint.view.ToggleButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
app:circle_ring_width="4dp"/>
activity中调用:
ToggleButton button = (ToggleButton) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
button.setOpen(!button.ToggleIsOpen());
}
});
然后就出现了我们点击的样子了。
。。。
好了,大家能够看看,也能够在我的基础上扩展了。刚学习这方面的东西。大神勿喷,要脸。
最后,代码 。
实现一个简单的android开关的更多相关文章
- 一个简单的Android小实例
原文:一个简单的Android小实例 一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台 3.安装J ...
- Android高效的应用程序开发工具集1---ant构建一个简单的Android工程
在java编译那些事通过提到ant编译Java工程,如今扩大到用它来构建Android目,事实上道理是相通的.变化的仅仅是使用的形式.ant构建相比IDE的优点是多个子项目使用自己定义jar包时,an ...
- 一个简单的Android富文本TextView实现
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px Helvetica; color: #555555 } p.p2 { margin: 0.0p ...
- 使用工具Android Studio实现一个简单的Android版的新闻APP
目的: 这是我学完Android课程后所写的一个小的.简单版的新闻APP 技术概要: 用到了SQLite数据库,用它来存储每篇新闻下的评论 新闻的来源是新浪新闻,我通过使用Fiddler来对新浪新闻A ...
- 一个简单的Android木马病毒的分析
一.样本信息 文件名称: 一个安卓病毒木马.apk 文件大小:242867 byte 文件类型:application/jar 病毒名称:Android.Trojan.SMSSend.KS 样本MD5 ...
- 一个简单的Android音乐播放器
Android小白的期末作业 Android期末项目,仅用作学习使用,在线音乐部分只获取了网易云热歌榜,API来自鼻子亲了脸 传送门: GitHub 参考: anddiencn 实现功能 展示出本地的 ...
- 一个简单的Android小实例分享,包含recycleView与recyclerView嵌套
先上图: 1.首页 2.第二页 3.第三页 项目目录: 代码不多,本人太懒,就不贴了 项目地址:
- 我的第一个 Mono for Android 应用
创建 Mono for Android 应用 打开 MonoDevelop , 选择新建解决方案, 左边的分类选择 "Mono for Android" , 右边选择 " ...
- Appium+Robotframework实现Android应用的自动化测试-6:一个简单的例子
万事具备,只欠编码! 下面看一个简单的示例,这个示例验证Android手机自带的通讯录的添加联系人的操作是否成功.这个例子是Appium官网自带的示例,有兴趣的同学也可以自己下载来研究和学习,下载地址 ...
随机推荐
- LintCode: Search A 2d Matrix
1. 设查找的数位y,第一行最后一列的数位x 如果x<y,x是第一行最大的,所以第一行都小于y,删除第一行: 如果x>y,x是最后一列最小的,所以最后一列都大于y,删除最后一列: 这样保证 ...
- 基于FPGA的超声波测距(一)
硬件平台:CycloneII EP2C5Q208C8+DYP-ME007 1:超声波原理 DYP-ME007超声波测距模块可提供3cm--3.5m的非接触式距离感测功能,图1为DYP-ME007外观, ...
- 带你走进EJB--将EJB发布为Webservice(3)
在上面文章中我们讲到,通过使用用JBoss5作为EJB容器的时候,调用Web服务出现了异常. 异常信息如下: *********************** CreateWeb Service Cli ...
- 树莓派系统(Debain)中设置SSH服务开机自启动
一.方式: 禁用命令:sudo update-rc.d ssh disable 启用命令:sudo update-rc.d ssh enable 二.chkconfig的方式: 1.安装:apt-ge ...
- HDU 3001 Travelling (三进制状态压缩 DP)
题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...
- PPT里面的背景音乐找不到?
ppt,找不到播放器,却有音乐播放!如何实现? 原来是在幻灯片切换处的音效添加的音乐~ 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- 转:VS2013快捷键大全
Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL ...
- ES6 class 技术点拾遗
语法 方法不需要加function,方法之间不需要加分号 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() ...
- Canvas动画 位图缓存提高效率和对应的内存问题
对一个矢量图动画,开启位图缓存能大大提高运行效率.所谓开启位图缓存,其实要自己动手,先创建一个临时canvas,然后把矢量图绘制到这个canvas上,到了实际绘制时,直接把这个临时canvas拷贝到真 ...
- 微软的在线文档存储OneDrive使用帮助
onedrive默认空间5G,对于一般的文档存储够用的,很方便不限速!!! ###官方介绍 https://support.office.com/zh-cn/article/%E4%BA%86%E8% ...