欢迎使用CSDN-markdown编辑器
来源:互联网 发布:利用广告联盟做淘宝客 编辑:程序博客网 时间:2024/06/05 18:04
Android 自定义控件(一)
本例子已[SwitchView][6]为例:
- 创建SwitchView类 extends View
public class SwitchView extends View { private Bitmap backgroundBitmap; private Bitmap slideBitmap; private int lEFT; private int l; // 当前的状态 private static boolean open = false; // 定义一个成员变量 private OnCheckedChangeListener listener; // 回调方法 public void setOnChangeListener(OnCheckedChangeListener listener) { this.listener = listener; } /** * 1、声明接口 * * @author Blake * */ public interface OnCheckedChangeListener { void onCheckedChanged(SwitchView view, boolean idOpen); } public SwitchView(Context context) { super(context); init(); } public SwitchView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public SwitchView(Context context, AttributeSet attrs) { super(context, attrs); init(); open=attrs.getAttributeBooleanValue( "http://schemas.android.com/apk/res/com.itsflfly.switchview", "isChecked", false); flushState(); } /** * 初始化 */ private void init() { backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background); slideBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button); lEFT = backgroundBitmap.getWidth() - slideBitmap.getWidth(); setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isClick) { if (open) { open = false; } else { open = true; } flushState(); } isClick = true; } }); } private int startX; private int distance = 0;// 滑块滑动的距离 , 通过滑动的距离来进行是否点击事件 private boolean isClick = true;// 点击事件的标志 @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN:// 手指按下时的坐标 // X 轴坐标变化 Y轴坐标没有变化 startX = (int) event.getX(); break; case MotionEvent.ACTION_MOVE:// 手指移动时的处理 int newX = (int) event.getX(); int dX = newX - startX; distance += Math.abs(dX);// 滑动的距离 l += dX; flushView(); startX = newX; break; case MotionEvent.ACTION_UP: if (distance > 1) { isClick = false; distance = 0; } if (!isClick) { if (l <= lEFT / 2) { open = false; } else { open = true; } flushState(); } break; } return super.onTouchEvent(event); } /** * move 移动时刷新view */ public void flushView() { if (l < 0) { l = 0; } else if (l > lEFT) { l = lEFT; } invalidate(); } /** * up 抬起时刷新状态 开 关 */ public void flushState() { if (open) { l = lEFT; } else { l = 0; } if (listener != null) { listener.onCheckedChanged(SwitchView.this, open); } invalidate(); } /** * 设置测量的规则 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 设置控件的大小 setMeasuredDimension(backgroundBitmap.getWidth(), backgroundBitmap.getHeight());// } /** * 绘制控件 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(backgroundBitmap, 0, 0, null);// 绘制选择按钮的背景 // canvas.drawBitmap(slideBitmap, lEFT, 0, null);//绘制滑块图片 开的状态 canvas.drawBitmap(slideBitmap, l, 0, null);// 绘制滑块图片状态 /* * if (open) { canvas.drawBitmap(slideBitmap, lEFT, 0, null);// 开的状态 } * else { canvas.drawBitmap(slideBitmap, 0, 0, null);// 关的状态 * * } */ }}
- 自定义属性
这里写代码片
0 0
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- UDP打洞
- 【NYOJ】[77]开灯问题
- BeanCreationException: Error creating bean with name 'sessionFactory' defined
- memcache 的编译和安装
- 安卓开发之自定义View------> 圆形头像ImageView
- 欢迎使用CSDN-markdown编辑器
- JavaScript设计模式学习笔记
- Android数据存储方式之SharedPreferences
- SpringMvc和Struts2的区别
- Leetcode 250Count Univalue Subtrees
- Context initialization failed
- 【Java SE】————如何做到跨平台性的?
- C/C++log日志库比较
- [LeetCode] 315