因项目缘故需又一次定制SwitchButton,效果例如以下:

 

步骤例如以下:

1.圆角矩形的绘制

2.字体绘制

3.小圆绘制

4.左右滑动动画效果绘制

代码例如以下:

package com.smart.view;

import java.util.Timer;
import java.util.TimerTask; import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View; public class MySwitchButton extends View{ private int w, h;//组件宽高
private boolean flag_switch;//开关标志
private boolean flag_touch;//触摸标志
private String ON = "ON";
private String OFF = "OFF";
private float textSize = 40;//字体大小
private int color1 = 0xff999999;//关背景颜色
private int color2 = 0xff3e9edb;//开背景颜色
private int color_bg = color1;
private int circle_bg_nomal = Color.WHITE;//圆正常情况下的背景
private int circle_bg_touch = Color.YELLOW;//触摸时圆的背景 //圆心
private float y;
private float x;
private float radius;//圆半径
private int distance = 10;//左右边距 private OnCircleClickListner mOnCircleClickListner; public MySwitchButton(Context context) {
super(context);
System.out.println("---MySwitchButton1---");
} public MySwitchButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
System.out.println("---MySwitchButton2---");
} public MySwitchButton(Context context, AttributeSet attrs) {
super(context, attrs);
System.out.println("---MySwitchButton3---");
} public void setOnCircleClickListner(OnCircleClickListner mOnCircleClickListner){
this.mOnCircleClickListner = mOnCircleClickListner;
} public boolean isFlag_switch() {
return flag_switch;
} public void setChecked(boolean flag_switch) {
this.flag_switch = flag_switch;
if(flag_switch){
x = distance+radius;
color_bg = color2;
}else{
x = w-(distance+radius);
color_bg = color1;
}
circleMove();
// invalidate(); } @Override
public boolean onTouchEvent(MotionEvent event) {
// float x = event.getX();
// float y = event.getY(); switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: flag_touch = true;
invalidate();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
if(mOnCircleClickListner!=null){
mOnCircleClickListner.onClick(MySwitchButton.this,!flag_switch);
}
flag_touch = false;
invalidate();
break;
} return true;
} @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh); this.w = w;
this.h = h;
y = h/2;
radius = h/2-distance;
x = distance+radius; // color_bg = color1;
circleMove();
// invalidate();
System.out.println("-----onSizeChanged----");
// System.out.println("x:"+x);
// System.out.println("w:"+w);
// System.out.println("h:"+h);
} @Override
protected void onDraw(Canvas canvas) {
System.out.println("-----onDraw----");
Paint paint = new Paint();
paint.setAntiAlias(true);
canvas2RoundRect(canvas,paint);//圆角矩形
canvas2Text(canvas,paint);//字体
canvas2Circle(canvas,paint);//小圆
super.onDraw(canvas); } public void canvas2RoundRect(Canvas canvas,Paint paint){
paint.setColor(color_bg);
RectF oval3 = new RectF(0, 0, w, h);
canvas.drawRoundRect(oval3, 45, 45, paint); } public void canvas2Circle(Canvas canvas,Paint paint){
if(flag_touch){
paint.setColor(circle_bg_touch);
}else{
paint.setColor(circle_bg_nomal);
}
// circleMove();
// System.out.println("drawX:"+x);
canvas.drawCircle(x, y, radius, paint);
} Timer timer;
TimerTask task;
public void circleMove(){//小圆运动轨迹
final float startX =distance+radius;
final float endX = w-(distance+radius);
final long upDataDistance = 10;
if(timer!=null){
task.cancel();
timer.cancel();
timer=null;
task=null;
}
timer = new Timer();
task = new TimerTask() { @Override
public void run() {
if(flag_switch){
x+=upDataDistance;//打开
}else{
x-=upDataDistance;//关闭 }
if(x>=endX){
x=endX;
this.cancel();
timer.cancel();
timer =null;
}else if(x<startX){
x = startX;
this.cancel();
timer.cancel();
timer =null;
}
postInvalidate();
}
};
timer.schedule(task, 8, 8); } public void canvas2Text(Canvas canvas,Paint paint){ paint.setTextSize(textSize);
paint.setColor(Color.WHITE);
Rect rect = new Rect();
if(flag_switch){
paint.getTextBounds(ON, 0, ON.length()-1, rect);
int textHight = rect.height();
float textWight = paint.measureText(ON);
canvas.drawText(ON, (w/2-textWight)/2, (h+textHight)/2, paint);
}else{
paint.getTextBounds(OFF, 0, OFF.length()-1, rect);
float textWight = paint.measureText(OFF);
int textHight = rect.height();
canvas.drawText(OFF, w/2+(w/2-textWight)/2, (h+textHight)/2, paint);
}
} public interface OnCircleClickListner{ public void onClick(View v,boolean flag);
} }
   <com.example.test_myview.MySwitchButton
android:id="@+id/msb"
android:layout_width="70dp"
android:layout_height="27dp" />

监听接口时要调用public void setChecked(boolean flag_switch)该方法才干使小球左右滑动

andorid 自己定义SwitchButton的更多相关文章

  1. andorid自己定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager

    近期的项目中,有一个需求要用ViewPager中嵌套ViewPager去实现整个效果.没做不论什么处理做出来后,仅仅能不停的滑动子ViewPager,父ViewPager就无法滑动了,这样肯定是不满足 ...

  2. Android 与 js 简单互调

    总结: Android 调用  js: 在 Android 中创建通往 javascript 的接口; 在 html  中定义要执行的方法; 在  Android  中的具体事件中进行调用. cont ...

  3. 超文本传输协议-HTTP/1.1

    超文本传输协议-HTTP/1.1(修订版) ---译者:孙超进本协议不限流传发布.版权声明Copyright (C) The Internet Society (1999). All Rights R ...

  4. android 自己定义开关(SwitchButton)

    近期心血来潮,写了一个自己定义仿iPhone的开关. 有须要的同学能够来下载啦.支持点击自己主动滚动,速率能够自己依据须要改动.触摸滚动,大小自己定义,支持改动样式.就不录制动画,就上传了两张图给大家 ...

  5. Android自己定义View基础篇(三)之SwitchButton开关

    自己定义View基础篇(二) 自己定义View基础篇(一) 自己定义View原理 我在解说之前,先来看看效果图,有图有真相:(转换gif图片效果太差) 那来看看真实图片: 假设你要更改样式,请改动例如 ...

  6. Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?

    在 <Cordova webapp实战开发:(4)Android环境搭建>中我们搭建好了开发环境,也给大家布置了调用插件的预习作业,做得如何了呢?今天我们来学一下如何自己从头建立一个And ...

  7. 【转】Android SwitchButton(滑动开关)

    原文网址:http://blog.csdn.net/wangjinyu501/article/details/27961303 版本:1.0 日期:2014.5.17 2014.6.1 版权:© 20 ...

  8. Android 自己定义View (二) 进阶

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125 继续自己定义View之旅.前面已经介绍过一个自己定义View的基础 ...

  9. 小牟Andorid下面MD5具体实现的思路总结

    Android的开发往往需要一定数目demo 从今起MD5一些加密算法提取物 看看是如何实现的 首先,我们必须明确为什么加密? 1 数据安全处理 2 防止数据窃取 3 有效的避免恶意攻击 4 保证文件 ...

随机推荐

  1. 在Qt Creator的项目中添加头文件和库

    在Qt Creator中的工程中,工程通过.pro文件管理. 额外需要连接的连接库unix:LIBS += -L your_lib_path -lyour_libwin32:LIBS += your_ ...

  2. Python操作MySQL数据库完成简易的增删改查功能

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目介绍 二丶效果展示 三丶数据准备 四丶代码实现 五丶完整代码 一丶项目介绍 1.叙述 博主闲暇之余花了10个小时写的 ...

  3. 洛谷——P1781 宇宙总统

    https://www.luogu.org/problem/show?pid=1781 题目背景 宇宙总统竞选 题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人 ...

  4. PowerApps和Flow,Power BI开发

    为PowerApps和Flow,Power BI开发自定义连接器 作者:陈希章 发表于 2017年12月20日 前言 我在之前用了几篇文章来介绍新一代微软商业应用平台三剑客(PowerApps,Mic ...

  5. Python 极简教程(五)输入输出

    输入函数,用于接收键盘输入.主要用于在学习和练习过程中,增加练习的乐趣.让我们的程序相对完整和具备简单的交互能力. 输出函数,将代码运行结果打印在控制台上,同样也能让我们观察程序运行的结果.也是为了增 ...

  6. 【前端统计图】echarts实现属性修改

    原图: 原代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  7. 【CS Round #43 A】Expected Dice

    [链接]https://csacademy.com/contest/round-43/task/expected-dice/ [题意] 大水题 [题解] 把36种可能的结果都存下来. 然后把重复出现的 ...

  8. 【河南省多校脸萌第六场 E】LLM找对象

    [链接]点击打开链接 [题意] 在这里写题意 [题解] 把n个时间离散化一下. 对于不是相邻的点,在两者之间再加一个空格就好. 这样最多会有1000个位置. 则定义dp[i][k][j] 表示前i个数 ...

  9. Project Euler 501 Eight Divisors (数论)

    题目链接: https://projecteuler.net/problem=501 题意: \(f(n)\) be the count of numbers not exceeding \(n\) ...

  10. 常用加密算法的Java实现总结(二)

    常用加密算法的Java实现总结(二) ——对称加密算法DES.3DES和AES 摘自:http://www.blogjava.net/amigoxie/archive/2014/07/06/41550 ...