先给大家展示下效果图:

不知道大家对效果图感觉怎么样,个人觉还不错,感兴趣的朋友可以参考下实现代码哦。

public class ToggleButton extends View {

private SpringSystem springSystem;

private Spring spring ;

/** */

private float radius;

/** 开启颜色*/

private int onColor = Color.parseColor("#4ebb7f");

/** 关闭颜色*/

private int offBorderColor = Color.parseColor("#dadbda");

/** 灰色带颜色*/

private int offColor = Color.parseColor("#ffffff");

/** 手柄颜色*/

private int spotColor = Color.parseColor("#ffffff");

/** 边框颜色*/

private int borderColor = offBorderColor;

/** 画笔*/

private Paint paint ;

/** 开关状态*/

private boolean toggleOn = false;

/** 边框大小*/

private int borderWidth = 2;

/** 垂直中心*/

private float centerY;

/** 按钮的开始和结束位置*/

private float startX, endX;

/** 手柄X位置的最小和最大值*/

private float spotMinX, spotMaxX;

/**手柄大小 */

private int spotSize ;

/** 手柄X位置*/

private float spotX;

/** 关闭时内部灰色带高度*/

private float offLineWidth;

/** */

private RectF rect = new RectF();

/** 默认使用动画*/

private boolean defaultAnimate = true;

/** 是否默认处于打开状态*/

private boolean isDefaultOn = false;

private OnToggleChanged listener;

private ToggleButton(Context context) {

super(context);

}

public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

setup(attrs);

}

public ToggleButton(Context context, AttributeSet attrs) {

super(context, attrs);

setup(attrs);

}

@Override

protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

spring.removeListener(springListener);

}

public void onAttachedToWindow() {

super.onAttachedToWindow();

spring.addListener(springListener);

}

public void setup(AttributeSet attrs) {

paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setStyle(Style.FILL);

paint.setStrokeCap(Cap.ROUND);

springSystem = SpringSystem.create();

spring = springSystem.createSpring();

spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(50, 7));

this.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

toggle(defaultAnimate);

}

});

TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleButton);

offBorderColor = typedArray.getColor(R.styleable.ToggleButton_tbOffBorderColor, offBorderColor);

onColor = typedArray.getColor(R.styleable.ToggleButton_tbOnColor, onColor);

spotColor = typedArray.getColor(R.styleable.ToggleButton_tbSpotColor, spotColor);

offColor = typedArray.getColor(R.styleable.ToggleButton_tbOffColor, offColor);

borderWidth = typedArray.getDimensionPixelSize(R.styleable.ToggleButton_tbBorderWidth, borderWidth);

defaultAnimate = typedArray.getBoolean(R.styleable.ToggleButton_tbAnimate, defaultAnimate);

isDefaultOn = typedArray.getBoolean(R.styleable.ToggleButton_tbAsDefaultOn, isDefaultOn);

typedArray.recycle();

borderColor = offBorderColor;

if (isDefaultOn) {

toggleOn();

}

}

public void toggle() {

toggle(true);

}

public void toggle(boolean animate) {

toggleOn = !toggleOn;

takeEffect(animate);

if(listener != null){

listener.onToggle(toggleOn);

}

}

public void toggleOn() {

setToggleOn();

if(listener != null){

listener.onToggle(toggleOn);

}

}

public void toggleOff() {

setToggleOff();

if(listener != null){

listener.onToggle(toggleOn);

}

}

/**

* 设置显示成打开样式,不会触发toggle事件

*/

public void setToggleOn() {

setToggleOn(true);

}

/**

* @param animate asd

*/

public void setToggleOn(boolean animate){

toggleOn = true;

takeEffect(animate);

}

/**

* 设置显示成关闭样式,不会触发toggle事件

*/

public void setToggleOff() {

setToggleOff(true);

}

public void setToggleOff(boolean animate) {

toggleOn = false;

takeEffect(animate);

}

private void takeEffect(boolean animate) {

if(animate){

spring.setEndValue(toggleOn ? 1 : 0);

}else{

//这里没有调用spring,所以spring里的当前值没有变更,这里要设置一下,同步两边的当前值

spring.setCurrentValue(toggleOn ? 1 : 0);

calculateEffect(toggleOn ? 1 : 0);

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

final int widthMode = MeasureSpec.getMode(widthMeasureSpec);

final int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

Resources r = Resources.getSystem();

if(widthMode == MeasureSpec.UNSPECIFIED || widthMode == MeasureSpec.AT_MOST){

widthSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, r.getDisplayMetrics());

widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);

}

if(heightMode == MeasureSpec.UNSPECIFIED || heightSize == MeasureSpec.AT_MOST){

heightSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, r.getDisplayMetrics());

heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.EXACTLY);

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

final int width = getWidth();

final int height = getHeight();

radius = Math.min(width, height) * 0.5f;

centerY = radius;

startX = radius;

endX = width - radius;

spotMinX = startX + borderWidth;

spotMaxX = endX - borderWidth;

spotSize = height - 4 * borderWidth;

spotX = toggleOn ? spotMaxX : spotMinX;

offLineWidth = 0;

}

SimpleSpringListener springListener = new SimpleSpringListener(){

@Override

public void onSpringUpdate(Spring spring) {

final double value = spring.getCurrentValue();

calculateEffect(value);

}

};

private int clamp(int value, int low, int high) {

return Math.min(Math.max(value, low), high);

}

@Override

public void draw(Canvas canvas) {

//

rect.set(0, 0, getWidth(), getHeight());

paint.setColor(borderColor);

canvas.drawRoundRect(rect, radius, radius, paint);

if(offLineWidth > 0){

final float cy = offLineWidth * 0.5f;

rect.set(spotX - cy, centerY - cy, endX + cy, centerY + cy);

paint.setColor(offColor);

canvas.drawRoundRect(rect, cy, cy, paint);

}

rect.set(spotX - 1 - radius, centerY - radius, spotX + 1.1f + radius, centerY + radius);

paint.setColor(borderColor);

canvas.drawRoundRect(rect, radius, radius, paint);

final float spotR = spotSize * 0.5f;

rect.set(spotX - spotR, centerY - spotR, spotX + spotR, centerY + spotR);

paint.setColor(spotColor);

canvas.drawRoundRect(rect, spotR, spotR, paint);

}

/**

* @param value

*/

private void calculateEffect(final double value) {

final float mapToggleX = (float) SpringUtil.mapValueFromRangeToRange(value, 0, 1, spotMinX, spotMaxX);

spotX = mapToggleX;

float mapOffLineWidth = (float) SpringUtil.mapValueFromRangeToRange(1 - value, 0, 1, 10, spotSize);

offLineWidth = mapOffLineWidth;

final int fb = Color.blue(onColor);

final int fr = Color.red(onColor);

final int fg = Color.green(onColor);

final int tb = Color.blue(offBorderColor);

final int tr = Color.red(offBorderColor);

final int tg = Color.green(offBorderColor);

int sb = (int) SpringUtil.mapValueFromRangeToRange(1 - value, 0, 1, fb, tb);

int sr = (int) SpringUtil.mapValueFromRangeToRange(1 - value, 0, 1, fr, tr);

int sg = (int) SpringUtil.mapValueFromRangeToRange(1 - value, 0, 1, fg, tg);

sb = clamp(sb, 0, 255);

sr = clamp(sr, 0, 255);

sg = clamp(sg, 0, 255);

borderColor = Color.rgb(sr, sg, sb);

postInvalidate();

}

/**

* @author ThinkPad

*

*/

public interface OnToggleChanged{

/**

* @param on = =

*/

public void onToggle(boolean on);

}

public void setOnToggleChanged(OnToggleChanged onToggleChanged) {

listener = onToggleChanged;

}

public boolean isAnimate() {

return defaultAnimate;

}

public void setAnimate(boolean animate) {

this.defaultAnimate = animate;

}

}

别忘了自定义属性:attrs.xml

main.xml

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

xmlns:toggle="http://schemas.android.com/apk/res-auto"

android:orientation="vertical"

>

android:layout_marginTop="10dp"

android:layout_width="match_parent"

android:gravity="center_horizontal"

android:layout_height="wrap_content">

android:id="@+id/mToggleButton01"

android:layout_width="54dp"

android:layout_height="30dp">

android:layout_marginTop="10dp"

android:layout_width="match_parent"

android:gravity="center_horizontal"

android:layout_height="wrap_content">

android:id="@+id/mToggleButton02"

android:layout_width="54dp"

android:layout_height="30dp"

toggle:tbBorderWidth="2dp"

toggle:tbOffBorderColor="#000"

toggle:tbOffColor="#ddd"

toggle:tbOnColor="#f00"

toggle:tbSpotColor="#00f">

Maintivity

public class MainActivity extends Activity {

private ToggleButton mToggleButton01;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mToggleButton01 = (ToggleButton) findViewById(R.id.mToggleButton01);

mToggleButton01.setOnToggleChanged(new ToggleButton.OnToggleChanged() {

@Override

public void onToggle(boolean on) {

if (on) {

Toast.makeText(MainActivity.this, "打开", Toast.LENGTH_SHORT).show();

}else {

Toast.makeText(MainActivity.this, "默认关闭", Toast.LENGTH_SHORT).show();

}

}

});

}

}

以上所述是小编给大家介绍的Android 之仿苹果IOS6开关按钮,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

android 高仿ios开关,Android 仿苹果IOS6开关按钮相关推荐

  1. android 高仿ios开关,Android自定义view仿IOS开关效果

    本文主要讲解如何在 Android 下实现高仿 iOS 的开关按钮,并非是在 Android 自带的 ToggleButton 上修改,而是使用 API 提供的 onDraw.onMeasure.Ca ...

  2. Android 自定义控件之 SwitchButton(仿 iOS 开关)

    上图中的按钮是 iOS 中的自带的开关控件,Android 也有很多优秀的仿这个控件的开源库,自己也是模仿着实现了一下,下面记录一下实现过程. 1 思路 首先还是来进行分解动作,从静态样子来看,这个开 ...

  3. android 仿ios三级联动,仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果...

    Android-PickerView 注意事项.详请使用方式.更新日志等,请查看 Wiki文档 Wiki文档,Wiki文档,Wiki文档 !~ 重要的事情说三遍 对于使用上有任何疑问或优化建议等,欢迎 ...

  4. android仿ios菊花,简易仿ios菊花加载loading图

    项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loading,一般用的比较多的是仿照ios 的菊花加载loading 图,当然一些条件下还会涉及到加载成功/ 失败情况 ...

  5. android 5.0 ios 8,Android 5.0和iOS8.1哪个好?安卓5.0与iOS8.1区别对比

    Android和iOS显然是目前最受欢迎的移动平台,也是最大的两个竞争者.在今年,谷歌和苹果都对各自的系统进行了更新,其中iOS8.1已经正式推送,相信各位苹果用户已经正在使用:而Android 5. ...

  6. android标签循环,iOS和Android规范解析——标签导航和分段控件

    从今天开始,将介绍iOS和Android设计规范中关于导航的部分.今天要介绍的两个控件,经常容易混淆以至于用错.请各位读者仔细阅读,防止以后用错. Material Design Guidelines ...

  7. 国内用户ios android比例,国内iOS、Android系统的设备总量已达到了2亿

    首先,在2012年第三季度时,国内iOS.Android系统的设备总量已达到了2亿.在今年3月的时候,这一指标只有8700万,也就是说设备在半年内增长了125%.而在设备量大增的同时,用户也变得依赖移 ...

  8. 小米android iso,从iOS到Android——小米11及小米生态实际使用体验

    从iOS到Android--小米11及小米生态实际使用体验 2021-02-22 15:29:56 93点赞 155收藏 131评论 创作立场声明:文中的设备均为自购,无任何特定立场. 2021年2月 ...

  9. ios 运行android应用程序,iOS与Android应用程序沙盒机制的研究与总结

    简介 复杂系统始终存在漏洞, 软件复杂性只会随着时间的推移而增加.无论您如何谨慎地采用安全编码实践并防范错误, 攻击者只需通过一次防御即可成功.虽然应用沙盒不能防止对你的应用的攻击, 但它确实最大限度 ...

  10. ios和android组件对比,iOS 和 Android 设计规范对比

    作为移动端两大主流系统,iOS和Android在设计原则上有很多相近的地方,比如自适应设计.颜色,措辞.启动画面方面的设计原则,但是由于Android本身开源的特性,它的设计和底部硬件关联相对较少,设 ...

最新文章

  1. CPU三级缓存技术解析
  2. ora-01017 invalid username/password logon denied
  3. LeetCode每日训练1——爬楼梯问题(2020.7.1)
  4. java 运行war_javaweb项目在Eclipse中启动Tomcat后运行正常,但是打成war包启动后运行异常的问题?...
  5. 在github上搭建hexo博客
  6. android 应用区高度,Android创建显示区高度可以调整的ScrollView
  7. 多种问题袭来:崩溃在边缘的“直播赚钱路”
  8. 2台主机极致实现双主复制架构及MMM
  9. echarts 生成 迁徙图_Echarts世界级迁徙图
  10. 远程访问及控制工具SSH
  11. 2022年起重机司机(限桥式起重机)报名考试及起重机司机(限桥式起重机)考试资料
  12. oracle中锁机制,Oracle锁的基本机制
  13. Java面向对象编程练习题(28题集)
  14. 尚品宅配、欧派激战整装市场
  15. Amazon Alexa通过云控制Bluetooth Mesh设备
  16. matlab氢原子杂化轨道,原子及分子轨道演示软件——Orbital Viewer
  17. 【拜占庭将军问题】这一计谋,可以让诸葛丞相兴复汉室
  18. SCSS 中这些技巧,你可能还不知道!
  19. 真香!有了这个搜索大法,GitHub玩到飞起来!
  20. JNI教程(一):什么是JNI

热门文章

  1. 看完此篇文章可以快速熟悉Spring事务
  2. 数据库update和alter之间的区别
  3. Stroke:利用人类遗传学理解缺血性卒中预后的机制
  4. 计算机基础和web相关知识点
  5. 数学 - 基本初等函数导数公式及求导法则
  6. Windows Terminal 设置背景图片
  7. 微信公众号迁移:流程指引、迁移内容、注意事项、申请函公证指引
  8. 如何阅读源码学习总结
  9. 邮箱服务器如何配置?POP和IMAP如何定义?
  10. 日历时间选择 开始时间到结束时间