Android开发之自定义开关
来源:互联网 发布:fm自建球员数据锁定 编辑:程序博客网 时间:2024/06/03 20:11
/** * 一个视图从创建到显示过程中的主要方法 * //1.构造方法实例化类 * //2.测量-measure(int,int)-->onMeasure(); * 如果当前View是一个ViewGroup,还有义务测量孩子 * 孩子有建议权 * //3.指定位置-layout()-->onLayout(); * 指定控件的位置,一般View不用写这个方法,ViewGroup的时候才需要,一般View不需要重写该方法 * //4.绘制视图--draw()-->onDraw(canvas) * 根据上面两个方法参数,进入绘制 */public class MyToggleButton extends View implements View.OnClickListener { private Bitmap backgroundBitmap; private Bitmap slidingBitmap; /** * 距离左边最大距离 */ private int slidLeftMax; private Paint paint; private int slideLeft; private float startX; private float lastX; private boolean isOpen = false; /** * 如果我们在布局文件使用该类,将会用这个构造方法实例该类,如果没有就崩溃 * @param context * @param attrs */ public MyToggleButton(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { paint = new Paint(); paint.setAntiAlias(true);//设置抗锯齿 backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background); slidingBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.slide_button); slidLeftMax = backgroundBitmap.getWidth() - slidingBitmap.getWidth(); setOnClickListener(this); } /** * 视图的测量 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(backgroundBitmap.getWidth(), backgroundBitmap.getHeight()); } /** * 绘制 * @param canvas */ @Override protected void onDraw(Canvas canvas) {// super.onDraw(canvas); canvas.drawBitmap(backgroundBitmap,0,0,paint); canvas.drawBitmap(slidingBitmap, slideLeft, 0, paint); } /** * true:点击事件生效,滑动事件不生效 * false:点击事件不生效,滑动事件生效 */ private boolean isEnableClick = true; @Override public void onClick(View v) { if(isEnableClick){ isOpen = !isOpen; flushView(); } } private void flushView() { if(isOpen){ slideLeft = slidLeftMax; }else{ slideLeft = 0; } invalidate();//会导致onDraw()执行 } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event);//执行父类的方法 switch (event.getAction()){ case MotionEvent.ACTION_DOWN: //1.记录按下的坐标 lastX = startX = event.getX(); isEnableClick = true; break; case MotionEvent.ACTION_MOVE: //2.计算结束值 float endX = event.getX(); //3.计算偏移量 float distanceX = endX - startX;// slideLeft = (int) (slideLeft + distanceX); slideLeft += distanceX; if(slideLeft <0){ slideLeft = 0; }else if(slideLeft>slidLeftMax){ slideLeft = slidLeftMax; } //4.屏蔽非法值 //5.刷新 invalidate(); //6.数据还原 startX = event.getX(); if(Math.abs(endX - lastX) > 5){ //滑动 isEnableClick = false; } break; case MotionEvent.ACTION_UP: if(!isEnableClick){ if(slideLeft > slidLeftMax/2){ //显示按钮开 isOpen = true; }else{ isOpen = false; } flushView(); } break; } return true; }}
0 0
- Android开发之自定义开关
- android开发笔记之自定义开关按钮
- Android之自定义开关控件
- Android自定义View之自定义开关按钮
- android自定义View之滑动开关SlideButton
- Android自定义控件之滑动开关
- Android进阶自定义控件之滑动开关
- Android自定义控件之状态开关
- [Android开发] 自定义View之重写View非常简单实现开关按钮SwitchView
- Android开发-自定义view-简化版自定义开关
- 自定义View之开关
- Android自定义开关按钮
- android 自定义开关按钮
- android自定义开关
- Android 自定义开关控件
- android自定义开关控件
- Android 自定义开关控件
- Android自定义Switch开关
- 409. Longest Palindrome
- Linux强制用户下线
- RecyclerView 初探
- 删除json 属性
- 运算符的用法
- Android开发之自定义开关
- 伪静态规则配置
- 求最大子序列问题-数据结构
- WEB网站常见受攻击方式及解决办法
- 面对对象编程总结(二)
- 尺取法
- aria2参数使用说明 所有标签
- SQLServer 中发布与订阅
- Two Sum