Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android 仿苹果IOS6开关按钮大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

先给大家展示下效果图:

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;
}
}

别忘了自定义属性: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>
@H_512_0@main.xml

<?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>
@H_512_0@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();
}
}
});
}
}

猛戳这里:studio点击下载

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

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。