大佬教程收集整理的这篇文章主要介绍了Android 仿苹果IOS6开关按钮,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
先给大家展示下效果图:
不知道大家对效果图感觉怎么样,个人觉还不错,感兴趣的朋友可以参考下实现代码哦。
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.setSpringCon@L_874_13@(SpringCon@L_874_13@.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,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; } }
<?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>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="@R_262_10107@://scheR_583_11845@as.android.com/apk/res/android" xmlns:tools="@R_262_10107@://scheR_583_11845@as.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:toggle="@R_262_10107@://scheR_583_11845@as.android.com/apk/res-auto" android:orientation="vertical" > <LinearLayout android:layout_marginTop="10dp" android:layout_width="match_parent" android:gravity="center_horizontal" android:layout_height="wrap_content"> <com.example.ekikousei.view.ToggleButton android:id="@+id/mToggleButton01" android:layout_width="54dp" android:layout_height="30dp"> </com.example.ekikousei.view.ToggleButton> </LinearLayout> <LinearLayout android:layout_marginTop="10dp" android:layout_width="match_parent" android:gravity="center_horizontal" android:layout_height="wrap_content"> <com.example.ekikousei.view.ToggleButton 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"> </com.example.ekikousei.view.ToggleButton> </LinearLayout> </LinearLayout>
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(); } } }); } }
猛戳这里:studio点击下载
以上所述是小编给大家介绍的Android 之仿苹果IOS6开关按钮,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
以上是大佬教程为你收集整理的Android 仿苹果IOS6开关按钮全部内容,希望文章能够帮你解决Android 仿苹果IOS6开关按钮所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。