Android 自定义View——拖动选择时间控件
来源:互联网 发布:ubuntu 杀死进程 编辑:程序博客网 时间:2024/06/03 20:25
前段时间在项目中遇到一个自定义控件,需要实现拖动一个类似SeekBar的东西来选择时间段。花费了一些时间和精力搞了出来。效果图如下
具体的代码和注释在源码中都有,这里只贴出关键代码
关键代码
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); String measureHeight = "获取文本高度"; paint.getTextBounds(measureHeight, 0, measureHeight.length(), textound); //计算控件高度 timeheight = textound.height() + marginText + blockHeight + marginTimeBlock + seekBarHeight; /** * 高度为时间控件所需的高度,宽度占满屏幕宽度 */ setMeasuredDimension(timeWidth, timeheight); }
@Override protected void onDraw(Canvas canvas) { //绘制不可能选择的时间块 if (disSelectBlock != null && disSelectBlock.size() > 0) { Rect rect = new Rect(0,0,blockWidth,blockHeight); RectF rectf = new RectF(); rectf.top = marginText + textound.height(); rectf.bottom = textound.height() + blockHeight; BitmapFactory.Options options = new BitmapFactory.Options(); options.outWidth = blockWidth; options.outHeight = blockHeight; Bitmap notSelectBg = BitmapFactory.decodeResource(getResources(),R.drawable.time_disselect_bg,options); for (int i = 0; i < disSelectBlock.size(); i++) { rectf.left =disSelectBlock.get(i) * blockWidth; rectf.right = disSelectBlock.get(i) * blockWidth+blockWidth; canvas.drawBitmap(notSelectBg,rect,rectf,null); } } //绘制文字 paint.setColor(getResources().getColor(R.color.white)); int time = beginTime; int lineStartY = 0;//绘制分割线的起始纵坐标 int lineEndX = textound.height() + blockHeight;//绘制分割线的终止纵坐标 for (int i = 0; i < timeBlockNum; i++) { if (i % 2 == 0) { String timeText = time + "时"; paint.getTextBounds(timeText, 0, timeText.length(), textound); canvas.drawText(timeText, blockWidth + blockWidth * i - textound.height(), textound.height(), paint); time++; //短的分割线的起始纵坐标 lineStartY = textound.height() + blockHeight / 2; } else { //长的分割线的起始纵坐标 lineStartY = textound.height(); } lineStartY += marginText; //绘制时间块分割线 canvas.drawLine(blockWidth * i, lineStartY, blockWidth * i, lineEndX, paint); } //绘制最后端的一条分割短线 canvas.drawLine(timeWidth, lineStartY + blockHeight / 2, timeWidth, lineEndX, paint); paint.setStrokeWidth(1); paint.setColor(getResources().getColor(R.color.gray)); //绘制拖动条顶部的线条 canvas.drawLine(0, timeheight - seekBarHeight, timeWidth, timeheight - seekBarHeight, paint); //绘制拖动条底部的线条 paint.setStrokeWidth(2); canvas.drawLine(0, timeheight, timeWidth - 2, timeheight - 2, paint); if (seekBarStart != 0) { //绘制拖动条尾部 paint.setStrokeWidth(0); paint.setColor(getResources().getColor(R.color.color_fabe00)); int disNum = seekBarEnd - seekBarStart; int startX = seekBarStart * blockWidth + bodyDistance; if (startX < blockWidth) { startX = blockWidth; } else if (startX > timeWidth - blockWidth - disNum * blockWidth) { startX = timeWidth - blockWidth - disNum * blockWidth; } int endX = seekBarEnd * blockWidth + moveDistance + bodyDistance; if (endX > timeWidth - blockWidth) { endX = timeWidth - blockWidth; } else if (bodyDistance != 0 && endX < startX + blockWidth * disNum) { endX = startX + blockWidth * disNum; } else if (endX < startX + blockWidth) { endX = startX + blockWidth; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { canvas.drawRoundRect(startX, timeheight - seekBarHeight + 10, endX, timeheight - 10, 4, 4, paint); } else { canvas.drawRect(startX, timeheight - seekBarHeight + 10, endX, timeheight - 10, paint); } //绘制拖动条头部圆圈 paint.setColor(getResources().getColor(R.color.color_eb7938)); canvas.drawCircle(endX, timeheight - seekBarHeight / 2, seekBarHeight / 2, paint); paint.setColor(getResources().getColor(R.color.white)); canvas.drawCircle(endX, timeheight - seekBarHeight / 2, seekBarHeight / 4, paint); } }
——————————————————————
源码地址
0 0
- Android 自定义View——拖动选择时间控件
- android开发自定义View,可以自由拖动的控件
- Android 自定义View——自定义View控件
- Android 自定义View——自定义View控件
- 自定义Android日期时间选择控件DateTimePickerDialog
- Android 自定义时间滑轮选择控件
- Android自定义view——组合控件
- android自定义View——组合控件
- Android自定义时间控件选择开始时间到结束时间
- 自定义View-5-拖动选择按钮
- 自定义View——可拖动设置时间的时钟具体实现1
- 自定义View——可拖动设置时间的时钟具体实现2
- 自定义VIEW,可拖动的控件
- 自定义View控件画圆,拖动圆
- Android自定义时间控件不可选择未来时间
- Android自定义控件——自定义View绘制钟表
- android 自定义View研究(二) — 自定义控件添加属性
- android 自定义View研究(三) — 自定义组合控件
- 二分查找
- Retrofit的Get与Post请求
- 基于libevent的多线程通信框架实现
- 文件各格式转化成Base64字符串b
- MagicIndicator
- Android 自定义View——拖动选择时间控件
- ios developer tiny share-20160808
- [iOS 相机相册调用] UIImagePickerController 简单实用 [转]
- Android数据库的Demo演示
- 小白装openstack(三) 安装数据库等必要服务
- CSS3
- 访问附有_weak修饰符的变量
- 总结:对Java内存模型JMM的理解
- FFmpeg常用基本命令