自定义view——自定义开关
来源:互联网 发布:服务器装mysql 编辑:程序博客网 时间:2024/05/03 20:54
自定义代码如下:
/**
* 一个视图从创建到显示过程中的主要方法
* 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);// 设置抗锯齿
// 将资源转换成bitmap对象
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;
}
}
- 自定义view — Toggle开关
- 自定义view——自定义开关
- 自定义View开关按钮
- 继承View 自定义开关
- 自定义View之开关
- 自定义View-滑动开关
- 自定义View滑动开关
- 自定义View之自定义开关
- Android自定义View——开关按钮SwitchButton
- Android自定义View示例(二)—滑动开关
- IOS自定义view------swtichbutton开关
- 自定义view(滑动开关)
- 继承View自定义开关控件
- android自定义view实现开关
- android自定义滑动开关控件,自定义view
- Android自定义View之自定义开关按钮
- 自定义View的总结(自定义滑动开关)
- android自定义View之滑动开关SlideButton
- linux gdb 调试多线程
- Unity渲染队列
- ThinkCMF踩过的坑之循环嵌套
- JDK源码解析集合篇--LinkedList全解析
- 第五十五篇: JAVA简易WEB服务器(五)
- 自定义view——自定义开关
- Class.getResource 等等各种获取路径以及一些问题总结
- 获得文件的MD5
- 创建 3D 控件_2.设置角色蓝图
- 跳台阶
- mybatis时间转换出错
- Idea 中提示:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
- Cocos2dx-lua plist文件组合显示卡牌
- 哲学家就餐问题与解决方案