您的位置:首页 > 其它

自定义按钮

2016-07-13 17:33 411 查看
packagecom.example.myapplication;
importandroid.os.Bundle;
importandroid.support.v7.app.AppCompatActivity;
importandroid.view.View;
importjava.util.ArrayList;
importjava.util.List;
publicclassMainActivityextendsAppCompatActivity{
privateList<View>imageDatas=newArrayList<>();
privateSlideSwitchslideSwitch;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Stringwifionoff=PreferenceUtil.getString(MainActivity.this,"wifionoff","0","tuhu_wifi");
slideSwitch=(SlideSwitch)findViewById(R.id.setting_wiff);
slideSwitch.setSlideListener(newSlideSwitch.SlideListener(){
@Override
publicvoidopen(){
PreferenceUtil.setString(MainActivity.this,"wifionoff","0","tuhu_wifi");
}
@Override
publicvoidclose(){
PreferenceUtil.setString(MainActivity.this,"wifionoff","1","tuhu_wifi");
}
});
if(wifionoff.equals("0")){
slideSwitch.setState(true);
}elseif(wifionoff.equals("1")){
slideSwitch.setState(false);
}
}
}
[/code]
packagecom.example.myapplication;
importandroid.animation.Animator;
importandroid.animation.AnimatorListenerAdapter;
importandroid.animation.ValueAnimator;
importandroid.animation.ValueAnimator.AnimatorUpdateListener;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.RectF;
importandroid.os.Bundle;
importandroid.os.Looper;
importandroid.os.Parcelable;
importandroid.support.v4.view.MotionEventCompat;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.animation.AccelerateDecelerateInterpolator;
/**
*Createdbyxiaoguanguoon16/3/28.
*/
publicclassSlideSwitchextendsView{
publicstaticfinalintSHAPE_RECT=1;
publicstaticfinalintSHAPE_CIRCLE=2;
privatestaticfinalintRIM_SIZE=6;
privatestaticfinalintDEFAULT_ROUND_RADIO=20;
privatestaticfinalintDEFAULT_ROUND_COLOR=Color.parseColor("#eeeeee");
privatestaticfinalintDEFAULT_COLOR_THEME=Color.parseColor("#e83d40");
//3attributes
privateintcolor_theme;
privatebooleanisOpen;
privateintshape;
//varialsofdrawing
privatePaintpaint;
//privatePaintpaintb;
privateRectFbackRect;
privateRectFfrontRect;
privateRectFfrontCircleRect;
privateRectFbackCircleRect;
privateintalpha;
privateintmax_left;
privateintmin_left;
privatefloatfrontRect_left;
privatefloatfrontRect_left_begin=RIM_SIZE;
privateinteventStartX;
privateinteventLastX;
privateintdiffX=0;
privatebooleanslideable=true;
privateSlideListenerlistener;
publicinterfaceSlideListener{
publicvoidopen();
publicvoidclose();
}
publicSlideSwitch(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
listener=null;
paint=newPaint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
//paintb=newPaint();
//paintb.setAntiAlias(true);
//paintb.setStyle(Paint.Style.STROKE);
TypedArraya=context.obtainStyledAttributes(attrs,
R.styleable.slideswitch);
color_theme=a.getColor(R.styleable.slideswitch_themeColor,
DEFAULT_COLOR_THEME);
isOpen=a.getBoolean(R.styleable.slideswitch_isOpen,false);
shape=a.getInt(R.styleable.slideswitch_shape,SHAPE_RECT);
a.recycle();
}
publicSlideSwitch(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicSlideSwitch(Contextcontext){
this(context,null);
}
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
intwidth=measureDimension(280,widthMeasureSpec);
intheight=measureDimension(140,heightMeasureSpec);
if(shape==SHAPE_CIRCLE){
if(width<height)
width=height*2;
}
setMeasuredDimension(width,height);
initDrawingVal();
}
publicvoidinitDrawingVal(){
intwidth=getMeasuredWidth();
intheight=getMeasuredHeight();
backCircleRect=newRectF();
frontCircleRect=newRectF();
frontRect=newRectF();
backRect=newRectF(0,0,width,height);
min_left=RIM_SIZE;
if(shape==SHAPE_RECT)
max_left=width/2;
else
max_left=width-(height-2*RIM_SIZE)-RIM_SIZE;
if(isOpen){
frontRect_left=max_left;
alpha=255;
}else{
frontRect_left=RIM_SIZE;
alpha=0;
}
frontRect_left_begin=frontRect_left;
}
publicintmeasureDimension(intdefaultSize,intmeasureSpec){
intresult;
intspecMode=MeasureSpec.getMode(measureSpec);
intspecSize=MeasureSpec.getSize(measureSpec);
if(specMode==MeasureSpec.EXACTLY){
result=specSize;
}else{
result=defaultSize;//UNSPECIFIED
if(specMode==MeasureSpec.AT_MOST){
result=Math.min(result,specSize);
}
}
returnresult;
}
@Override
protectedvoidonDraw(Canvascanvas){
if(shape==SHAPE_RECT){
paint.setColor(DEFAULT_ROUND_COLOR);
canvas.drawRoundRect(backRect,DEFAULT_ROUND_RADIO,DEFAULT_ROUND_RADIO,paint);
//paintb.setColor(DEFAULT_ROUND_COLOR);
//canvas.drawRoundRect(backRect,DEFAULT_ROUND_RADIO,DEFAULT_ROUND_RADIO,paintb);
paint.setColor(alpha<=20?DEFAULT_ROUND_COLOR:color_theme);
paint.setAlpha(alpha);
canvas.drawRoundRect(backRect,DEFAULT_ROUND_RADIO,DEFAULT_ROUND_RADIO,paint);
frontRect.set(frontRect_left,RIM_SIZE,frontRect_left
+getMeasuredWidth()/2-RIM_SIZE,getMeasuredHeight()
-RIM_SIZE);
paint.setColor(Color.WHITE);
canvas.drawRoundRect(frontRect,DEFAULT_ROUND_RADIO,DEFAULT_ROUND_RADIO,paint);
//canvas.drawRoundRect(frontRect,DEFAULT_ROUND_RADIO,DEFAULT_ROUND_RADIO,paintb);
}else{
//drawcircle
floatradius;
radius=backRect.height()/2-RIM_SIZE;
paint.setColor(DEFAULT_ROUND_COLOR);
backCircleRect.set(backRect);
canvas.drawRoundRect(backCircleRect,radius,radius,paint);
paint.setColor(alpha<=20?DEFAULT_ROUND_COLOR:color_theme);
paint.setAlpha(alpha);
canvas.drawRoundRect(backCircleRect,radius,radius,paint);
frontRect.set(frontRect_left,RIM_SIZE,frontRect_left
+backRect.height()-2*RIM_SIZE,backRect.height()
-RIM_SIZE);
frontCircleRect.set(frontRect);
paint.setColor(Color.WHITE);
canvas.drawRoundRect(frontCircleRect,radius,radius,paint);
}
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
if(slideable==false)
returnsuper.onTouchEvent(event);
intaction=MotionEventCompat.getActionMasked(event);
switch(action){
caseMotionEvent.ACTION_DOWN:
eventStartX=(int)event.getRawX();
break;
caseMotionEvent.ACTION_MOVE:
eventLastX=(int)event.getRawX();
diffX=eventLastX-eventStartX;
floattempX=diffX+frontRect_left_begin;
tempX=(tempX>max_left?max_left:tempX);
tempX=(tempX<min_left?min_left:tempX);
if(tempX>=min_left&&tempX<=max_left){
frontRect_left=tempX;
alpha=(int)(255*(float)tempX/(float)max_left);
invalidateView();
}
break;
caseMotionEvent.ACTION_UP:
intwholeX=(int)(event.getRawX()-eventStartX);
frontRect_left_begin=frontRect_left;
booleantoRight;
toRight=(frontRect_left_begin>max_left/2?true:false);
if(Math.abs(wholeX)<3){
toRight=!toRight;
}
moveToDest(toRight);
break;
default:
break;
}
returntrue;
}
/**
*drawagain
*/
privatevoidinvalidateView(){
if(Looper.getMainLooper()==Looper.myLooper()){
invalidate();
}else{
postInvalidate();
}
}
publicvoidsetSlideListener(SlideListenerlistener){
this.listener=listener;
}
publicvoidmoveToDest(finalbooleantoRight){
ValueAnimatortoDestAnim=ValueAnimator.ofFloat(frontRect_left,
toRight?max_left:min_left);
toDestAnim.setDuration(500);
toDestAnim.setInterpolator(newAccelerateDecelerateInterpolator());
toDestAnim.start();
toDestAnim.addUpdateListener(newAnimatorUpdateListener(){
@Override
publicvoidonAnimationUpdate(ValueAnimatoranimation){
frontRect_left=(Float)animation.getAnimatedValue();
alpha=(int)(255*(float)frontRect_left/(float)max_left);
invalidateView();
}
});
toDestAnim.addListener(newAnimatorListenerAdapter(){
@Override
publicvoidonAnimationEnd(Animatoranimation){
if(toRight){
isOpen=true;
if(listener!=null)
listener.open();
frontRect_left_begin=max_left;
}else{
isOpen=false;
if(listener!=null)
listener.close();
frontRect_left_begin=min_left;
}
}
});
}
publicvoidsetState(booleanisOpen){
this.isOpen=isOpen;
initDrawingVal();
invalidateView();
if(listener!=null)
if(isOpen==true){
listener.open();
}else{
listener.close();
}
}
publicvoidsetShapeType(intshapeType){
this.shape=shapeType;
}
publicvoidsetSlideable(booleanslideable){
this.slideable=slideable;
}
@Override
protectedvoidonRestoreInstanceState(Parcelablestate){
if(stateinstanceofBundle){
Bundlebundle=(Bundle)state;
this.isOpen=bundle.getBoolean("isOpen");
state=bundle.getParcelable("instanceState");
}
super.onRestoreInstanceState(state);
}
@Override
protectedParcelableonSaveInstanceState(){
Bundlebundle=newBundle();
bundle.putParcelable("instanceState",super.onSaveInstanceState());
bundle.putBoolean("isOpen",this.isOpen);
returnbundle;
}
}
[/code]
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns: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"
tools:context="com.example.myapplication.MainActivity">
<RelativeLayout
xmlns:slideswitch="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="45dp"
android:layout_marginTop="14dp"
android:background="@color/white"
android:clickable="true"
android:gravity="center_vertical"
android:onClick="onClick">
<TextView
android:id="@+id/textView28"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="15dp"
android:text="WIFI环境下自动下载更新包"
android:textColor="#222"
android:textSize="14sp"/>
<com.example.myapplication.SlideSwitch
android:id="@+id/setting_wiff"
android:layout_width="50dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
slideswitch:isOpen="false"
slideswitch:shape="rect"
slideswitch:themeColor="@color/head_colors"/>
</RelativeLayout>
</LinearLayout>
[/code]
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: