近期在学习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());
}
});

然后就出现了我们点击的样子了。

。。。

好了,大家能够看看,也能够在我的基础上扩展了。刚学习这方面的东西。大神勿喷,要脸。

最后,代码

最新文章

  1. 相克军_Oracle体系_随堂笔记013-字符集
  2. jquery-leonaScroll-1.2-自定义滚动条插件
  3. php之JavaScript
  4. VS2010与水晶报表V13的打包集成小结
  5. hdu 3074 Zjnu Stadium (带权并查集)
  6. Java开发之单例设计模式
  7. Linux 内核动态函数调用可视化工具
  8. Leetcode 190. Reverse Bits(反转比特数)
  9. 初学C++,开博第一篇
  10. ssh连接失败解决方法
  11. php加密解密实用类
  12. mvc自带的异步表单提交
  13. 如何使用eclipse生成javadoc帮助文档
  14. FreeBSD包管理
  15. Cisco Packet Tracer 6.0 实验笔记
  16. Java关键字之finalize
  17. java基础系列--volatile关键字
  18. angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令
  19. 17 汽车服务工程 李腾飞 Excel 课程表
  20. win7下面iis错误汇总

热门文章

  1. Visual Studio 开始支持编写 Android 程序并自带 Android 模拟器【转载】
  2. ubuntu 上使用valgrind
  3. Python+OpenCV实现FasterRcnn样本查看器
  4. 世纪互联提供的关于Powershell中将虚拟机加入备份保管库的方法
  5. 【推荐】ImageProcessor.Web,再也不用自己生成缩略图了
  6. Nginx 访问日志分析
  7. Shell与Bash
  8. Android——开机自启动app
  9. BIEE Demo(RPD创建 + 分析 +仪表盘 )
  10. java 生成二维码后叠加LOGO并转换成base64