Android 仿苹果IOS6开关按钮

Android 仿苹果IOS6开关按钮,第1张

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

先给大家展示下效果图:

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

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);}@OverrIDeprotected 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() {@OverrIDepublic 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);}}@OverrIDeprotected 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);}@OverrIDeprotected 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(){@OverrIDepublic 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);}@OverrIDepublic voID draw(Canvas canvas) {//rect.set(0,getWIDth(),getHeight());paint.setcolor(bordercolor);canvas.drawRoundRect(rect,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,paint);}rect.set(spotX - 1 - radius,centerY - radius,spotX + 1.1f + radius,centerY + radius);paint.setcolor(bordercolor);canvas.drawRoundRect(rect,paint);final float spotR = spotSize * 0.5f;rect.set(spotX - spotR,centerY - spotR,spotX + spotR,centerY + spotR);paint.setcolor(spotcolor);canvas.drawRoundRect(rect,spotR,paint);}/*** @param value*/private voID calculateEffect(final double value) {final float mapToggleX = (float) SpringUtil.mapValueFromrangetoRange(value,1,spotMinX,spotMaxX);spotX = mapToggleX;float mapOfflinewidth = (float) SpringUtil.mapValueFromrangetoRange(1 - value,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,fb,tb);int sr = (int) SpringUtil.mapValueFromrangetoRange(1 - value,fr,tr);int sg = (int) SpringUtil.mapValueFromrangetoRange(1 - value,fg,tg);sb = clamp(sb,255);sr = clamp(sr,255);sg = clamp(sg,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

<?xml version="1.0" enCoding="utf-8"?><resources><declare-styleable name="Togglebutton"><attr name="tbborderWIDth" format="dimension"/><attr name="tbOffbordercolor" format="reference|color"/><attr name="tbOffcolor" format="reference|color"/><attr name="tbOncolor" format="reference|color"/><attr name="tbSpotcolor" format="reference|color"/><attr name="tbAnimate" format="reference|boolean"/><attr name="tbAsDefaultOn" format="reference|boolean"/></declare-styleable></resources>

main.xml

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"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"><linearLayoutandroID:layout_margintop="10dp"androID:layout_wIDth="match_parent"androID:gravity="center_horizontal"androID:layout_height="wrap_content"><com.example.ekikousei.vIEw.TogglebuttonandroID:ID="@+ID/mTogglebutton01"androID:layout_wIDth="54dp"androID:layout_height="30dp"></com.example.ekikousei.vIEw.Togglebutton></linearLayout><linearLayoutandroID:layout_margintop="10dp"androID:layout_wIDth="match_parent"androID:gravity="center_horizontal"androID:layout_height="wrap_content"><com.example.ekikousei.vIEw.TogglebuttonandroID: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"></com.example.ekikousei.vIEw.Togglebutton></linearLayout></linearLayout>

Maintivity

public class MainActivity extends Activity {private Togglebutton mTogglebutton01;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentVIEw(R.layout.activity_main);mTogglebutton01 = (Togglebutton) findVIEwByID(R.ID.mTogglebutton01);mTogglebutton01.setonToggleChanged(new Togglebutton.OnToggleChanged() {@OverrIDepublic voID onToggle(boolean on) {if (on) {Toast.makeText(MainActivity.this,"打开",Toast.LENGTH_SHORT).show();}else {Toast.makeText(MainActivity.this,"默认关闭",Toast.LENGTH_SHORT).show();}}});}}

猛戳这里:studio点击下载

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

总结

以上是内存溢出为你收集整理的Android 仿苹果IOS6开关按钮全部内容,希望文章能够帮你解决Android 仿苹果IOS6开关按钮所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1149666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存