重写ImageSwtichView
2016-04-23 12:53
232 查看
TypeArray需要配置的String.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="SwitchButtonView"> <attr name="checked" format="boolean"></attr> </declare-styleable> </resources>
在xml中使用自定义的标签 下面是layout_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:myapp="http://schemas.android.com/apk/res/com.example.pulltorefreshtest" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.example.pulltorefreshtest.SwitchButtonView android:id="@+id/refreshable_view" android:layout_width="wrap_content" android:layout_height="wrap_content" myapp:checked="true" > </com.example.pulltorefreshtest.SwitchButtonView> </RelativeLayout>
xmlns:myapp=”http://schemas.android.com/apk/res/com.example.pulltorefreshtest”
中的myapp是自定义的,com.example. … 包是自己的工程包名,下面的myapp:checked 属性 也要对应起来 (myapp 要上下对应 )
package com.example.pulltorefreshtest; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; /** * Created by Administrator on 3/22 0022. */ public class SwitchButtonView extends View { private Paint mPaint; private Bitmap bitmapBackGround; private Bitmap bitmapBall; private Bitmap bitmapBottom; private Bitmap bitmapBlack; private PorterDuffXfermode pdf; private boolean isChecked; private int touchX; private int ballX = 0; private int ballMoveState = LEFT_MOST; private int saveFlags; private int switchWidth; private int switchHeight; private static final int LEFT_MOST = 0; private static final int RIGHT_MOST = 1; private static final int TOUCH_STATE_DOWN = 2; private static final int TOUCH_STATE_MOVE = 3; private static final int TOUCH_STATE_UP = 4; private onSwitchListener mListener; public SwitchButtonView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SwitchButtonView); isChecked = ta.getBoolean(R.styleable.SwitchButtonView_checked, true); ta.recycle(); init(context); } public SwitchButtonView(Context context) { this(context, null); init(context); } private void init(Context context) { mPaint = new Paint(); mPaint.setAntiAlias(true); pdf = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); saveFlags = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG; bitmapBackGround = BitmapFactory.decodeResource(getResources(), R.drawable.switch_bg); bitmapBall = BitmapFactory.decodeResource(getResources(), R.drawable.switch_ball); bitmapBottom = BitmapFactory.decodeResource(getResources(), R.drawable.switch_bottom); bitmapBlack = BitmapFactory.decodeResource(getResources(), R.drawable.switch_black); switchWidth = bitmapBackGround.getWidth(); switchHeight = bitmapBackGround.getHeight(); if (isChecked) { ballMoveState = RIGHT_MOST; ballX = bitmapBackGround.getWidth() - bitmapBall.getWidth(); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(switchWidth, switchHeight); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.saveLayer(0, 0, switchWidth, switchHeight, null, saveFlags); canvas.drawBitmap(bitmapBlack, 0, 0, mPaint); mPaint.setXfermode(pdf); if (isChecked) { canvas.drawBitmap(bitmapBottom, 0 - (switchWidth - bitmapBall.getWidth() - ballX), 0, mPaint); } else { canvas.drawBitmap(bitmapBottom, -(bitmapBottom.getWidth() / 2 - bitmapBall.getWidth() / 2) + ballX, 0, mPaint); } mPaint.setXfermode(null); canvas.restore(); ballMoveState(canvas); } /** * 滑动状态绘制 * * @param canvas */ private void ballMoveState(Canvas canvas) { switch (ballMoveState) { case TOUCH_STATE_DOWN: case TOUCH_STATE_MOVE: if (touchX > 0 && touchX < switchWidth - bitmapBall.getWidth()) { canvas.drawBitmap(bitmapBall, touchX, 0, mPaint); } else if (touchX <= 0) { canvas.drawBitmap(bitmapBall, 0, 0, mPaint); } else if (touchX >= switchWidth - bitmapBall.getWidth()) { canvas.drawBitmap(bitmapBall, switchWidth - bitmapBall.getWidth(), 0, mPaint); } break; case TOUCH_STATE_UP: case LEFT_MOST: if (touchX > 0 && touchX < switchWidth / 2) { canvas.drawBitmap(bitmapBall, 0, 0, mPaint); } else if (touchX >= switchWidth / 2 && touchX <= switchWidth) { canvas.drawBitmap(bitmapBall, switchWidth - bitmapBall.getWidth(), 0, mPaint); } else if (touchX <= 0) { canvas.drawBitmap(bitmapBall, 0, 0, mPaint); } else if (touchX >= switchWidth - bitmapBall.getWidth()) { canvas.drawBitmap(bitmapBall, switchWidth - bitmapBall.getWidth(), 0, mPaint); } break; case RIGHT_MOST: canvas.drawBitmap(bitmapBall, switchWidth - bitmapBall.getWidth(), 0, mPaint); break; default: break; } } @Override public boolean onTouchEvent(MotionEvent event) { Log.i("check", event.getX() + "----------------"); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touchStateChange((int) event.getX(), TOUCH_STATE_DOWN); break; case MotionEvent.ACTION_MOVE: touchStateChange((int) event.getX(), TOUCH_STATE_MOVE); break; case MotionEvent.ACTION_UP: touchStateChange((int) event.getX(), TOUCH_STATE_UP); break; default: break; } return true; } /** * 触摸状态改变 touchX 控制在 (0,bg。getwidth) * * @param mTouchX * @param touchState */ private void touchStateChange(int mTouchX, int touchState) { ballX = touchX = mTouchX; if (touchX <= 0) { ballX = 0; } if (touchX >= switchWidth - bitmapBall.getWidth()) { ballX = switchWidth - bitmapBall.getWidth(); } ballMoveState = touchState; if (ballMoveState == TOUCH_STATE_UP) { ballX = 0; if (touchX >= switchWidth / 2f) { isChecked = true; ballX = switchWidth - bitmapBall.getWidth(); } else { isChecked = false; } if (mListener != null) { mListener.onSwitchChanged(isChecked); } } invalidate(); } public void setOnSwitchListener(onSwitchListener listener) { this.mListener = listener; } public interface onSwitchListener { void onSwitchChanged(boolean isCheck); } }
相关文章推荐
- poj1386 Play on Words 欧拉路径
- make、cmake、make install、configure
- JAVA接口的简单实现
- 不熟悉的关键字们
- html5背景视频使用总结
- 铜城购项目运营经验之转型:生或者死【三】【新商机的出现】
- JVM内存管理及垃圾回收
- mac sublime 2 常用快捷键
- PageRank 算法
- 同步、异步、阻塞与非阻塞
- 第一阶段站立会议5
- ubuntu安装jdk-6u45-linux-x64.bin___ZC_20160423
- Linux_常用命令_01
- 《day18_String练习_基本类型包装类_集合入门》
- Lucene学习之初步了解
- UVA - 457 Linear Cellular Automata
- Android Studio下提示Couldn't load BaiduMapSDK_v3_1_0
- 铜城购项目运营经验之转型:生或者死【二】【从业前调查】
- 《day17_String_StringBuffer》
- 【leetcode】64. Minimum Path Sum