实现一个简单的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横行的年代,不加点动画就会显示生硬。举个梨子,我第一个遇到哥们做类似的开关时,直接叫视觉工程师[说白了就是美工]切了两张图,不得不说,那哥们很聪明很牛逼,我自然也是学到了,后来发现发现好生硬啊,没有一点美感,于是我就自己写了。

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. 背景的变色:

从关闭颜色到打开颜色,这其中是有颜色过度的,不清楚,好你看看这个:

清楚了吧,恩这个颜色该怎么玩呢????

很多大神的文章里,都是有个叫颜色估值器的介绍,即:

 ValueAnimator.ofArgb(...)

本来用这个很容易实现的,可以我练习的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就是指开始时的背景颜色。

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

最后,代码

时间: 2024-10-11 21:39:42

实现一个简单的android开关的相关文章

Android高效的应用程序开发工具集1---ant构建一个简单的Android工程

在java编译那些事通过提到ant编译Java工程,如今扩大到用它来构建Android目,事实上道理是相通的.变化的仅仅是使用的形式.ant构建相比IDE的优点是多个子项目使用自己定义jar包时,ant能够更好的完毕自己主动化构建.一个命令就搞定整个项目的编译而不用手工的导出jar包然后再将其放到指定文件夹. 这就是高效的构建工具所标榜的. 先来说说ant在Linux下的安装(那篇文章写的太过简单,事实上也是非常easy的,别看mannul中写的那么复杂). 1.ant的安装 最简单的办法就是直

一个简单的Android小实例

一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台 3.安装JDK 二.intellij idea新建Android工程 1.File->New-Project... 2.选择Android->Application Module,下一步 说明:建议选择这个项,建立的是一个可以运行的几乎是空的工程,是用ant进行构建的目录结构: gradle:Android module,建立的工程是以gradle

一个简单的Android UDP Client

(该代码在4.2.2内调试通过) 1.记得加权限 <uses-permission android:name="android.permission.INTERNET"/> 注意:Android 4.0之后,就不能在主线程进行socket通信,否则会抛异常. 2.代码 MainActivity.java 1 package mao.example.quicksend; 2 3 4 import android.app.Activity; 5 import android.c

一个简单的android自定义view(Switch Button for api &lt; 14)

1.编写主类 package com.sample.button; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.widget.CompoundButton; impor

一个简单Android下载管理器的实现(支持断点续传)

近期工作不是很忙,时间比较多,所以在空闲时间准备自己编写一个简单的Android下载管理器.该管理器实现如下功能: 1.能够支持正常的下载,暂停,继续,安装操作. 2.支持断点续传,实现暂停继续功能,在推出应用后,再次进入应用依然能正常将文件下载完成. 3.实现实时状态回调,下载进度,速度,一目了然. 以上是UML设计图,这个简单下载器的实现,有几个技术难点,攻克它们问题就迎刃而解. 1.如何实现断点续传:这个问题其实不难,网上也有很多相关资料,基本原理都相同,就是记录下载任务上一次中断的位置,

开发一个简单实用的android紧急求助软件

之前女朋友一个人住,不怎么放心,想找一个紧急求助的软件,万一有什么突发情况,可以立即知道.用金山手机卫士的手机定位功能可以知道对方的位置状态,但不能主动发送求助信息,在网上了很多的APK,都是鸡肋功能,都需要解锁.并打开软件,真正的紧急情况可能没有时间来完成这一系列操作. 于是我自己做了一个这样的软件,在紧急情况下,连续按电源键5次即可发送求救短信和位置信息给事先指定的用户,这个操作在裤兜里就能完成.原理很简单,就是设置监听器捕获屏幕的开关,在较短的时间内屏幕开关达到一定次数后,触发手机定位,定

Kivy a to Z -- 一个简单的通过adb同步Android系统文件的工具

来兴趣时写了些Kivy的代码,调试却总感觉不是很方便.直接打包到public.mp3的方式太繁锁,用文件共享的软件又发现没有一个好用的, 用samba filesharing本来也只是慢,但是更新的版本之后就一直提示说wifi没有tethering,意思是wifi热点没有打开,但是打开了还是提示没有tethering. 找了个叫什么卓*力的文件管理器,下载了samba插件后输入用户名和密码死活不对,被搞得实在恼火,花了点时间写了个通过adb同步安卓文件的工具,用着也挺爽的. 事件为什么总是要搞得

打造支持apk下载和html5缓存的 IIS(配合一个超简单的android APP使用)具体解释

为什么要做这个看起来不靠谱的东西呢? 由于刚学android开发,还不能非常好的熟练控制android界面的编辑和操作,所以我的一个急着要的运用就改为html5版本号了,反正这个运用也是须要从server获取大量数据来展示在手机上面的,也就是说:必须联网,才干正常工作,于是想了一下,反正都要联网获取数据,为什么不直接用我相对熟悉一点的 html来做这个运用呢?省的花费不够用的时间去学习android界面的控制,于是就简单了:用蹩脚的手段做了一个android程序的启动欢迎界面,内页就是一个全屏的

Android Handler的一个简单使用例子

在前面 开启一个线程Thread并用进度条显示进度 这篇文章里,我们用线程实现了这么一个简单的功能,就是点击按钮,加载进度条.但是有没有发现,点击一次之后,再次点击就会没效.我们可是需要每次点击都要显示下一张图片的.永盈会娱乐城 这里就需要引入 Android 的消息机制了,简单来说,就是 Handler.Looper 还有 Message Queue的使用.这里我们用一个简单的例子来说明 Handler 的使用,就是每次点击按钮,给消息队列发送一个数字 5.还是在 PaintingActivi