时间轴(一)
来源:互联网 发布:身份证算法器 编辑:程序博客网 时间:2024/05/17 02:57
http://blog.csdn.net/zhoumushui/article/details/54566146
http://blog.csdn.net/u013334392/article/details/52857116
实现时间轴,
这种方法是自定义view实现时间轴,内从在右侧的rececyview中实现
package com.liugl.alltest.view.shijianzhou;import android.content.Context;import android.content.res.Resources;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;import com.liugl.alltest.R;/** * TODO: document your custom view class. change by FrankLi */public class TimeLineView extends View { private Paint mPaint; /** * 第一个节点的外半径 */ private float timelineHeadRadius; /** * 第一个节点的颜色值 */ // private int timelineHeadColor; /** * 第二个节点的颜色值 */ private int timelineOtherColor; /** * 时间线的节点数 */ private int timelineCount; /** * 时间轴的位置 */ private int viewWidth; /** * 时间轴到距离顶部的距离 */ private int marginTop; /** * 时间轴的节点的半径 */ private int timelineRadius; /** * 时间轴节点之间的距离 */ private int timelineRadiusDistance; /** * 时间轴的宽度 */ private int timelineWidth; /** * 时间轴的高度 */ private float timeLineViewHeight; /** * 自己需求第一个显示的颜色图片 */ private Bitmap bitmapHead; public TimeLineView(Context context) { this(context, null); } public TimeLineView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TimeLineView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs, defStyle); } /** * 初始化 * * @param context * @param attrs * @param defStyle */ private void init(Context context, AttributeSet attrs, int defStyle) { final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TimeLineView, defStyle, 0); timelineRadiusDistance = (int) a.getDimension( R.styleable.TimeLineView_timelineRadiusDistance, convertDIP2PX(context, 20)); // timelineHeadRadius = // a.getDimension(R.styleable.TimeLineView_timelineHeadRadius, // convertDIP2PX(context, 10)); timelineRadius = (int) a.getDimension( R.styleable.TimeLineView_timelineRadius, convertDIP2PX(context, 5)); // timelineHeadColor = // a.getColor(R.styleable.TimeLineView_timelineHeadColor, // Color.parseColor("#F15719")); timelineOtherColor = a.getColor( R.styleable.TimeLineView_timelineOtherColor, Color.parseColor("#A8A8A8")); timelineCount = a.getInteger(R.styleable.TimeLineView_timelineCount, 0); timelineWidth = (int) a.getDimension( R.styleable.TimeLineView_timelineWidth, convertDIP2PX(context, 1)); marginTop = (int) a.getDimension( R.styleable.TimeLineView_timelineMarginTop, convertDIP2PX(context, 50)); a.recycle(); mPaint = new Paint(); mPaint.setAntiAlias(true); Resources res = getResources(); bitmapHead = BitmapFactory.decodeResource(res, R.drawable.icon_logistics); } /** * 画出Bitmap * * @param canvas * @param src * @param dst * @param bitmap */ private void drawBitmap(Canvas canvas, Rect src, Rect dst, Bitmap bitmap) { dst = (dst == null ? new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()) : dst); Paint paint = new Paint(); // canvas.drawBitmap(bitmap, src, dst, paint); canvas.drawBitmap(bitmap, viewWidth - (bitmap.getWidth() / 2), timelineHeadRadius + marginTop - (bitmap.getHeight() / 2) - 10, paint); } @Override protected void onDraw(Canvas canvas) { // 默认设置时间轴的位置位于view的中间 viewWidth = getMeasuredWidth() / 2; // 设置第一个节点的颜色 // mPaint.setColor(timelineHeadColor); /** * 根据时间轴的节点数目,画对应的节点和轴 */ for (int j = 1; j <= timelineCount; j++) { /** * 当j==1,画第一个节点的时候,有点特殊,我们需要在节点的外面再换一个圆环 */ if (j == 1) { Rect dstRect = new Rect(); drawBitmap(canvas, null, null, bitmapHead); // 画笔设置为空心 // canvas.drawCircle(viewWidth, timelineHeadRadius + marginTop, // timelineRadius, mPaint); // mPaint.setStyle(Paint.Style.STROKE); // mPaint.setStrokeWidth(5.0f); // //画第一个节点外围的圆环 // canvas.drawCircle(viewWidth, timelineHeadRadius + marginTop, // timelineHeadRadius, mPaint); // 设置画笔颜色,画其他时间节点的颜色 mPaint.setColor(timelineOtherColor); // 画笔设置为实心 mPaint.setStyle(Paint.Style.FILL); /** * 画第一个节点下面的轴 */ canvas.drawRect(new Rect(viewWidth - timelineWidth / 2, (int) (2 * timelineHeadRadius + marginTop) + 5, viewWidth + timelineWidth / 2, (int) (2 * timelineHeadRadius + timelineRadiusDistance + marginTop + 5)), mPaint); continue; } /** * 画时间轴的节点,即画圆形 圆心的x都是一样的,view的中间 * 圆心的y的计算是根据节点的位置来计算的,例如:第一个节点的y是根据第一个节点距离上面的距离加上第一个节点的半径 * :timelineHeadRadius + marginTop * 其余的节点就是在一个节点的y的基础上,加上两倍半径和节点之间的轴的长度*节点数:(2 * timelineRadius + * timelineRadiusDistance) * (j - 1) + timelineHeadRadius - * timelineRadius + marginTop * */ canvas.drawCircle(viewWidth, (2 * timelineRadius + timelineRadiusDistance) * (j - 1) + 2 * timelineHeadRadius - timelineRadius + marginTop, timelineRadius, mPaint); /** * 画其余的轴 left:每个轴距离左边距离都是一样的 时间轴的中心位置-1/2的时间轴的宽度 viewWidth - * timelineWidth / 2 top: (int) (j * (2 * timelineRadius + * timelineRadiusDistance) - timelineRadiusDistance + 2 * * (timelineHeadRadius-timelineRadius)+ marginTop) * right:每个轴距离右边距离都是一样的 时间轴的中心位置+1/2的时间轴的宽度 viewWidth + * timelineWidth / 2 bottom: (int) (j * (2 * timelineRadius + * timelineRadiusDistance) + 2 * * (timelineHeadRadius-timelineRadius)+ marginTop) */ if (j < timelineCount) { canvas.drawRect( new Rect( viewWidth - timelineWidth / 2, (int) (j * (2 * timelineRadius + timelineRadiusDistance) - timelineRadiusDistance + 2 * (timelineHeadRadius - timelineRadius) + marginTop), viewWidth + timelineWidth / 2, (int) (j * (2 * timelineRadius + timelineRadiusDistance) + 2 * (timelineHeadRadius - timelineRadius) + marginTop)), mPaint); } } } public float getTimelineHeadRadius() { return timelineHeadRadius; } public void setTimelineHeadRadius(float timelineHeadRadius) { this.timelineHeadRadius = timelineHeadRadius; invalidate(); } // public int getTimelineHeadColor() { // return timelineHeadColor; // } // // public void setTimelineHeadColor(int timelineHeadColor) { // // this.timelineHeadColor = timelineHeadColor; // invalidate(); // } public int getTimelineOtherColor() { return timelineOtherColor; } public void setTimelineOtherColor(int timelineOtherColor) { this.timelineOtherColor = timelineOtherColor; invalidate(); } public int getTimelineCount() { return timelineCount; } public void setTimelineCount(int timelineCount) { this.timelineCount = timelineCount; invalidate(); } public int getMarginTop() { return marginTop; } public void setMarginTop(int marginTop) { this.marginTop = marginTop; invalidate(); } public int getTimelineRadius() { return timelineRadius; } public void setTimelineRadius(int timelineRadius) { this.timelineRadius = timelineRadius; invalidate(); } public int getTimelineRadiusDistance() { return timelineRadiusDistance; } public void setTimelineRadiusDistance(int timelineRadiusDistance) { this.timelineRadiusDistance = timelineRadiusDistance; invalidate(); } public int getTimelineWidth() { return timelineWidth; } public void setTimelineWidth(int timelineWidth) { this.timelineWidth = timelineWidth; } public float getTimeLineViewHeight() { this.timeLineViewHeight = getMarginTop() + getTimelineCount() * (2 * getTimelineRadius() + getTimelineRadiusDistance()); return timeLineViewHeight; } public void setTimeLineViewHeight(float timeLineViewHeight) { this.timeLineViewHeight = timeLineViewHeight; invalidate(); } public int getViewWidth() { return viewWidth; } public void setViewWidth(int viewWidth) { this.viewWidth = viewWidth; invalidate(); } /** * 转换dip为px */ public static int convertDIP2PX(Context context, int dip) { float scale = context.getResources().getDisplayMetrics().density; return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1)); }}
阅读全文
0 0
- 时间轴(一)
- 时间类(一)
- Python 时间,日期,时间戳(一)
- Flex 时间控件(一)
- Linux时间管理(一)
- 《暗时间》经典(一)
- 【读书笔记】《暗时间》 (一)
- 时间序列实战(一)
- js处理时间(一)
- 数据结构(一) 时间复杂度
- 算法(一)时间复杂度
- 时间都去哪了(一)
- Android时间滚轮(一)
- 算法--入门(一)--时间
- 时间序列分析(一)
- 时间序列笔记(一)
- spectre.css知识点(一)时间轴的实现
- Linux时间子系统之(一):时间的基本概念
- 广度优先搜索的分酒问题解决方案
- 【C++】WMI获取系统硬件信息(CPU/DISK/NetWork etc)
- Java Executors(线程池)
- Android Studio如何集成Genymotion
- 设计模式六大原则-开闭原则
- 时间轴(一)
- Nginx 实战(一) 集群环境搭建
- C# 录音控制
- 9. Palindrome Number
- Markdown基本语法
- http statusCode(状态码) 200、300、400、500序列
- 指针
- 服务注册和服务发现-Eureka的服务认证和集群--Spring Cloud Netflix
- Java学习笔记_02