2013-12-28 17:25:01
網上看到一篇關於可滑動的ToogleButton的文章,有代碼,覺得挺好,但是不符合我的要求,因此在他的代碼基礎上改了一些。(作者看到了勿噴啊,實在找不到原文了,只好把代碼貼出來。)
源碼: http://download.csdn.net/detail/zshq280017423/4240703
先來兩張:
然後上代碼:
最主要的類是SlipButton.java
DownX, NowX; btn_on_left = btn_off_left = boolean NowChoose = ; boolean OnSlip = ; boolean isChgLsnOn = init() { bg_on = bg_off = slip_btn = btn_off_left = bg_off.getWidth() - setOnTouchListener(); onDraw(Canvas canvas) { Matrix matrix = Paint paint = (NowX < (bg_on.getWidth() / )) { x = NowX - slip_btn.getWidth() / canvas.drawBitmap(bg_off, matrix, paint); } x = bg_on.getWidth() - slip_btn.getWidth() / canvas.drawBitmap(bg_on, matrix, paint); (OnSlip) { (NowX >= bg_on.getWidth()) { x = bg_on.getWidth() - slip_btn.getWidth() / ; } (NowX < x = } x = NowX - slip_btn.getWidth() / } { (NowChoose) { x = canvas.drawBitmap(bg_on, matrix, paint); } x = x = isChecked = ! (x < ) { x = } (x > bg_on.getWidth() - x = bg_on.getWidth() - canvas.drawBitmap(slip_btn, x, , paint); boolean onTouch(View v, MotionEvent (.getAction()) { MotionEvent.ACTION_DOWN: (.getX() > || .getY() > OnSlip = DownX = NowX = MotionEvent.ACTION_MOVE: Log.d(, + Log.d(, + NowX = boolean LastChoose = (NowX >= (bg_on.getWidth() / NowChoose = } NowChoose = (isChgLsnOn && (LastChoose != NowChoose)) { MotionEvent.ACTION_UP: OnSlip = invalidate(); SetOnChangedListener(OnChangedListener l) { isChgLsnOn = ChgLsn = .isChecked = NowChoose = onMeasure( widthMeasureSpec, measuredHeight = measuredWidth = measureHeight( measureWidth( }
代碼比較簡單,而且注釋比較詳細。
說一些幾個問題:
1. onTouch()方法中得到的event.getX()和event.getY()是什麼值?取值範圍是多少?
剛開始我以為不管咱們的SlipButton放在什麼位置,得到的event.getX()值因該是相對螢幕的座標值,~~其實是錯誤的,event.getX()只有你的觸摸點在當前SlipButton view的布局範圍之內才會取到值的。但是值的範圍可不僅僅是你的SlipButton view的大小哦,因為一旦你的觸摸點在view範圍之內觸摸到,那麼觸摸點就可以移到View之外的任何地方了,所以取值範圍應該是全屏哦,因此我們在代碼裡做了如下判斷:
(.getX() > || .getY() > }
2. measureWidth()和measureHeight()為什麼會返回一個固定值?
首先根據用途,我們自訂的SlipButton View根本沒有必要去有調用者調整大小,因為這個ToggleButton本身就是起到開關作用的,應該在應用中是一致的,所以我讓這兩個方法返回固定值。關於onMeasure()方法根詳細的描述,請看我的另一篇文章:http://www.cnblogs.com/wlrhnh/p/3479928.html
下載源碼,請猛戳這裡。