Android 自定义绘制开关按钮
来源:互联网 发布:微软流程图软件 编辑:程序博客网 时间:2024/06/02 05:30
Android 自定义绘制开关按钮
在自定义开关按钮中需要用到3种图片
在自定义View推荐看这个博客(介绍自定义View的一些知识):
package com.example.debugdemo;import com.example.switchdemo.R;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener; public class WiperSwitch extends View implements OnTouchListener {private Bitmap bg_on, bg_off, slipper_btn;/** * 按下时的x和当前的x */private float downX, nowX;/** * 记录用户是否在滑动 */private boolean onSlip = false;/** * 当前的状态 */private boolean nowStatus = false;/** * 监听接口 */private OnChangedListener listener;public WiperSwitch(Context context) {super(context);init();}public WiperSwitch(Context context, AttributeSet attrs) {super(context, attrs);init();}public void init(){//载入图片资源bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.switch_kai);bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.switch_guan);slipper_btn = BitmapFactory.decodeResource(getResources(), R.drawable.switch_huadong);setOnTouchListener(this);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Matrix matrix = new Matrix();Paint paint = new Paint();float x = 0;//根据nowX设置背景,开或者关状态if (nowX < (bg_on.getWidth()/2)){canvas.drawBitmap(bg_off, matrix, paint);//画出关闭时的背景}else{canvas.drawBitmap(bg_on, matrix, paint);//画出打开时的背景 }if (onSlip) {//是否是在滑动状态, Log.i("TAG","滑动状态");if(nowX >= bg_on.getWidth())//是否划出指定范围,不能让滑块跑到外头,必须做这个判断x = bg_on.getWidth() - slipper_btn.getWidth()/2;//减去滑块1/2的长度elsex = nowX - slipper_btn.getWidth()/2;}else {if(nowStatus){//根据当前的状态设置滑块的x值x = bg_on.getWidth() - slipper_btn.getWidth();}else{x = 0;}}//对滑块滑动进行异常处理,不能让滑块出界if (x < 0 ){x = 0;}else if(x > bg_on.getWidth() - slipper_btn.getWidth()){x = bg_on.getWidth() - slipper_btn.getWidth();}//画出滑块canvas.drawBitmap(slipper_btn, x , 0, paint); }@Overridepublic boolean onTouch(View v, MotionEvent event) {switch(event.getAction()){case MotionEvent.ACTION_DOWN:{if (event.getX() > bg_off.getWidth() || event.getY() > bg_off.getHeight()){Log.i("TAG","超出了" );return false;}else{onSlip = true;downX = event.getX();nowX = downX;}break;}case MotionEvent.ACTION_MOVE:{nowX = event.getX();break;}case MotionEvent.ACTION_UP:{onSlip = false;if(event.getX() >= (bg_on.getWidth()/2)){nowStatus = true;nowX = bg_on.getWidth() - slipper_btn.getWidth();}else{nowStatus = false;nowX = 0;}if(listener != null){listener.OnChanged(WiperSwitch.this, nowStatus);}break;}}//刷新界面invalidate();return true;}/** * 为WiperSwitch设置一个监听,供外部调用的方法 * @param listener */public void setOnChangedListener(OnChangedListener listener){this.listener = listener;}/** * 设置滑动开关的初始状态,供外部调用 * @param checked */public void setChecked(boolean checked){if(checked){nowX = bg_off.getWidth();}else{nowX = 0;}nowStatus = checked;} /** * 回调接口 * @author len * */public interface OnChangedListener {public void OnChanged(WiperSwitch wiperSwitch, boolean checkState);} }
这个是一个比较简单的 自定义View
判断开关 也就是判断 椭圆形这个滑块的当前位置。
触摸的的滑 就到起点位置,再一次触摸 就到开关图片的一般。
这样就形成了开关按钮。
在外部调用onChange() 来回调开关按钮的监听事件
代码文件:
自定义滑动开关
0 0
- Android 自定义绘制开关按钮
- Android自定义开关按钮
- android 自定义开关按钮
- Android自定义开关按钮
- android 自定义开关按钮
- android--ImageView绘制开关按钮
- android自定义开关、图片按钮
- Android 中的自定义开关按钮
- Android 自定义仿微信开关按钮
- Android自定义View之自定义开关按钮
- Android 自定义实现switch开关按钮
- android 自定义竖开关按钮 SwitchButton
- Android 自定义实现switch开关按钮
- Android 自定义实现switch开关按钮
- Android 自定义实现switch开关按钮
- Android 自定义实现switch开关按钮
- android开发笔记之自定义开关按钮
- Android自定义View实现开关按钮
- Android渲染器Shader:LinearGradient(一)
- Android6.0的phone应用源码分析(2)——phone相关进程启动分析
- jquery textarea 启用、禁用 判断状态
- git on server(ssh)深入剖析,github提供服务原理
- html表格参考
- Android 自定义绘制开关按钮
- H5用FormData对象提交表单及上传文件
- yii2读写分离配置
- 字符串-409 - Excuses, Excuses!
- IIS是如何处理ASP.NET请求的
- 免费资源
- Android6.0的phone应用源码分析(3)——phone 拨号UI分析
- css3 media媒体查询器用法总结
- 外键约束