自定义开关

本文主要探讨如何在XML文件中定义并解析自定义开关,应用于软件配置管理。通过理解Main文件中的相关设置,实现灵活控制程序行为。
摘要由CSDN通过智能技术生成

xml,文件中


   <LinearLayout
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:gravity="center" >

           <com.hanju.util.SlideSwitch
               android:id="@+id/slideSwitch"
               android:layout_width="wrap_content"
               android:layout_height="match_parent"
               android:paddingLeft="10dp"
               android:paddingRight="10dp">
               
           </com.hanju.util.SlideSwitch>
       </LinearLayout>


自定义View


package com.hanju.util;

import com.hanju.activity.R;
import android.annotation.SuppressLint;
import android.content.Context;  
import android.content.res.Resources;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.graphics.Rect;  
import android.graphics.Typeface;  
import android.util.AttributeSet;  
import android.util.Log;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.ViewGroup.LayoutParams;


/** 
 * SlideSwitch 仿iphone滑动开关组件.
 * 组件分为三种状态:打开、关闭、正在滑动<br/> 
 * 使用方法:         
 * <pre>SlideSwitch slideSwitch = new SlideSwitch(this); 
 *slideSwitch.setOnSwitchChangedListener(onSwitchChangedListener); 
 *linearLayout.addView(slideSwitch); 
</pre> 
 * @author scott 
 * 
 */  
public class SlideSwitch extends View {  
    public static final String TAG = "SlideSwitch";  
    public static final int SWITCH_OFF = 0;//关闭状态  
    public static final int SWITCH_ON = 1;//打开状态  
    public static final int SWITCH_SCROLING = 2;//滚动状态  
  
    private int mSwitchStatus = SWITCH_ON;  
  
    private boolean mHasScrolled = false;//表示是否发生过滚动  
 
    private int mSrcX = 0, mDstX = 0;  
      
    private int mBmpWidth = 0;  
    private int mBmpHeight = 0;  
    private int mThumbWidth = 0;  
  
    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  
      
    private OnSwitchChangedListener mOnSwitchChangedListener = null;  
    
    private int Xlen = 0;
    private int Ylen = 0;
  
    //开关状态图  
    Bitmap mSwitch, mSwitch_thumb;  
  
    public SlideSwitch(Context context) {  
        this(context, null);  
    }  
  
    public SlideSwitch(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        init();  
    }  
  
    public SlideSwitch(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
        init();  
    }  
  
    //初始化三幅图片  
    private void init() {  
        Resources res = getResources();  
        mSwitch = BitmapFactory.decodeResource(res, R.drawable.switch_backgroud);  
        mSwitch_thumb = BitmapFactory.decodeResource(res, R.drawable.switch_btn);  
        mBmpWidth = mSwitch.getWidth();  
        mBmpHeight = mSwitch.getHeight();  
        mThumbWidth = mSwitch_thumb.getWidth();  
        Xlen = mSwitch_thumb.getWidth() / 5;
        Ylen = (mSwitch.getHeight() - mSwitch_thumb.getHeight()) / 2;
    }  
  
    @Override  
    public void setLayoutParams(LayoutParams params) {  
        params.width = mBmpWidth;  
        params.height = mBmpHeight;  
        super.setLayoutParams(params);  
    }  
      
    /** 
     * 为开关控件设置状态改变监听函数 
     * @param onSwitchChangedListener 参见 {@link OnSwitchChangedListener} 
     */  
    public void setOnSwitchChangedListener(OnSwitchChangedListener onSwitchChangedListener) {  
        mOnSwitchChangedListener = onSwitchChangedListener;  
    }  
      
    /** 
     * 设置开关的状态 
     * @param on 是否打开开关 打开为true 关闭为false 
     */  
    public void setStatus(boolean on) {  
        mSwitchStatus = ( on ? SWITCH_ON : SWITCH_OFF);  
    }  
      
    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        int action = event.getAction();  
        Log.i("滑动密文", "_____----------onTouchEvent  x="  + event.getX());  
        switch (action) {  
        case MotionEvent.ACTION_DOWN:  
            mSrcX = (int) event.getX();  
            break;  
        case MotionEvent.ACTION_MOVE:  
            mDstX = Math.max( (int) event.getX(), 0);  
            mDstX = Math.min( mDstX, 124);  
            if(mSrcX == mDstX)  
                return true;  
            mHasScrolled = true;  
            AnimationTransRunnable aTransRunnable = new AnimationTransRunnable(mSrcX, mDstX, 0);  
            new Thread(aTransRunnable).start();  
            mSrcX = mDstX;  
            break;  
        case MotionEvent.ACTION_UP: 
        	try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	//如果没有发生过滑动,就意味着这是一次单击过程  
            if(mHasScrolled == false) {  
                mSwitchStatus = Math.abs(mSwitchStatus-1);  
                int xFrom = 10, xTo = 62;  
                if(mSwitchStatus == SWITCH_OFF) {  
                    xFrom = 62;  
                    xTo = 10;  
                }  
                AnimationTransRunnable runnable = new AnimationTransRunnable(xFrom, xTo, 1);  
                new Thread(runnable).start();  
            } else {  
            	mSwitchStatus = (int) event.getX() > mBmpWidth / 2 ? SWITCH_ON : SWITCH_OFF; 
                invalidate();  
                mHasScrolled = false;  
            }  
            //状态改变的时候 回调事件函数  
            if(mOnSwitchChangedListener != null) {  
                mOnSwitchChangedListener.onSwitchChanged(this, mSwitchStatus);  
            }  
            break;  
        }  
        return true;  
    }  
  
    @Override  
    protected void onSizeChanged(int w, int h, int oldw, int oldh)  
    {  
        super.onSizeChanged(w, h, oldw, oldh);  
    }  
  
    @SuppressLint("DrawAllocation")
	@Override  
    protected void onDraw(Canvas canvas) {  
        super.onDraw(canvas);  
        mPaint.setTextSize(14);  
        mPaint.setTypeface(Typeface.DEFAULT_BOLD);  
          
        if(mSwitchStatus == SWITCH_OFF) {  
            drawBitmap(canvas, null, null, mSwitch);  
            drawOpenBitmap(canvas, mSwitch_thumb);  
            mPaint.setColor(Color.rgb(105, 105, 105));  
            canvas.translate(mSwitch_thumb.getWidth(), 0);  
        } else if(mSwitchStatus == SWITCH_ON) {  
            drawBitmap(canvas, null, null, mSwitch);  
            int count = canvas.save();  
            canvas.translate(mSwitch.getWidth() - mSwitch_thumb.getWidth() - 2 * Xlen, 0);  
            drawCloseBitmap(canvas, mSwitch_thumb);  
            mPaint.setColor(Color.WHITE);  
            canvas.restoreToCount(count);  
        } else {  
            mSwitchStatus = mDstX > 35 ? SWITCH_ON : SWITCH_OFF;  
            drawBitmap(canvas, new Rect(0, 0, mDstX, mBmpHeight), new Rect(0, 0, mDstX, mBmpHeight), mSwitch);  
            mPaint.setColor(Color.WHITE);  
  
            int count = canvas.save();  
            canvas.translate(mDstX, 0);  
            drawBitmap(canvas, new Rect(mDstX, 0, mBmpWidth, mBmpHeight),  
                          new Rect(0, 0, mBmpWidth - mDstX, mBmpHeight), mSwitch);  
            canvas.restoreToCount(count);  
            count = canvas.save();  
            canvas.clipRect(mDstX, 0, mBmpWidth, mBmpHeight);  
            canvas.translate(mThumbWidth, 0);  
            mPaint.setColor(Color.rgb(105, 105, 105));  
            canvas.restoreToCount(count);  
  
            count = canvas.save();  
            canvas.translate(mDstX - mThumbWidth / 2, 0);  
            drawScrollBitmap(canvas, mSwitch_thumb);  
            canvas.restoreToCount(count);  
        }  
  
    } 
    
    public void drawBitmap(Canvas canvas, Rect src, Rect dst, Bitmap bitmap) {  
        dst = (dst == null ? new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()) : dst);  
        Paint paint = new Paint();  
        canvas.drawBitmap(bitmap, src, dst, paint);  
    }  
    
    //滑动状态圆点
    public void drawScrollBitmap(Canvas canvas, Bitmap bitmap) {  
    	Rect rect1 = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    	Rect rect2 = new Rect(0, Ylen, bitmap.getWidth(), Ylen + bitmap.getHeight());
        Paint paint = new Paint();  
        canvas.drawBitmap(bitmap, rect1, rect2, paint);  
    }
    
    //关闭状态圆点
    public void drawCloseBitmap(Canvas canvas, Bitmap bitmap) {  
    	Rect rect1 = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    	Rect rect2 = new Rect(Xlen, Ylen, Xlen + bitmap.getWidth(), Ylen + bitmap.getHeight());
        Paint paint = new Paint();  
        canvas.drawBitmap(bitmap, rect1, rect2, paint);  
    }
    
    //打开状态圆点
    public void drawOpenBitmap(Canvas canvas, Bitmap bitmap) {  
    	Rect rect1 = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    	Rect rect2 = new Rect(Xlen, Ylen, Xlen + bitmap.getWidth(), Ylen + bitmap.getHeight());
        Paint paint = new Paint();  
        canvas.drawBitmap(bitmap, rect1, rect2, paint);  
    }
  
    /** 
     * AnimationTransRunnable 做滑动动画所使用的线程 
     */  
    private class AnimationTransRunnable implements Runnable {  
        private int srcX, dstX;  
        private int duration;  
  
        /** 
         * 滑动动画 
         * @param srcX 滑动起始点 
         * @param dstX 滑动终止点 
         * @param duration 是否采用动画,1采用,0不采用 
         */  
        public AnimationTransRunnable(float srcX, float dstX, final int duration) {  
            this.srcX = (int)srcX;  
            this.dstX = (int)dstX;  
            this.duration = duration;  
        }  
  
        @Override  
        public void run() {  
            final int patch = (dstX > srcX ? 5 : -5);  
            if(duration == 0) {  
                SlideSwitch.this.mSwitchStatus = SWITCH_SCROLING;  
                SlideSwitch.this.postInvalidate();  
            } else {  
                Log.d(TAG, "start Animation: [ " + srcX + " , " + dstX + " ]");  
                int x = srcX + patch;  
               while (Math.abs(x-dstX) > 5) {  
                    mDstX = x;  
                    SlideSwitch.this.mSwitchStatus = SWITCH_SCROLING;  
                    SlideSwitch.this.postInvalidate();  
                    x += patch;  
                    try {  
                        Thread.sleep(10);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
                mDstX = dstX;  
                SlideSwitch.this.mSwitchStatus = mDstX > 35 ? SWITCH_ON : SWITCH_OFF;  
                SlideSwitch.this.postInvalidate();  
            }  
        }  
  
    }  
  
    public static interface OnSwitchChangedListener {  
        /** 
         * 状态改变 回调函数 
        * @param status  SWITCH_ON表示打开 SWITCH_OFF表示关闭 
         */  
        public abstract void onSwitchChanged(SlideSwitch obj, int status);;  
       
    }  
  
}  



Main。文件中


 //密文状态
 public static final int SWITCH_OFF = 0;//关闭状态  
 public static final int SWITCH_ON = 1;//打开状态 

 SlideSwitch mSlideSwitch = null;



mSlideSwitch.setOnSwitchChangedListener(new OnSwitchChangedListener() {
   
   @Override
   public void onSwitchChanged(SlideSwitch obj, int status) {
    /** 
     * 状态改变 回调函数 
     * @param status  SWITCH_ON表示打开 SWITCH_OFF表示关闭 
     */  
    switch (status) {
    case SWITCH_ON:
     mEdit_password.setTransformationMethod(
       PasswordTransformationMethod.getInstance());
     
     break;
    case SWITCH_OFF:
     //设置为明文显示
     mEdit_password.setTransformationMethod(
       HideReturnsTransformationMethod.getInstance());
     
     break;
    }
    
    passWord = mEdit_password.getText().toString();
    mEdit_password.setSelection(passWord.length());
    
   }
  });
 }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值