English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Метод создания TimeLine информации о логистике Taobao:
Эффект временной шкалы, имитирующий TimeLine:
Реализация кода:
package com.zms.timelineview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; public class TimeLineView extends View { private Paint mPaint; /** * Внешний радиус первого узла */ private float timelineHeadRadius; /** * Цвет центра первого узла */ private int timelineHeadColor; /** * Цвет края первого узла */ private int timelineHeadColorEdge; /** * Цвет других узлов */ private int timelineOtherColor; /** * Количество узлов временной шкалы */ private int timelineCount; /** * Позиция временной шкалы */ private int viewWidth; /** * Расстояние от временной шкалы до верха */ private int marginTop; /** * Радиус узлов временной шкалы */ private int timelineRadius; /** * Расстояние между узлами временной шкалы */ private int timelineRadiusDistance; /** * Ширина временной шкалы */ private int timelineWidth; /** * Высота временной шкалы */ private float timeLineViewHeight; 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, 6)); timelineRadius = (int) a.getDimension( R.styleable.TimeLineView_timelineRadius convertDIP2PX(context, 5)); timelineHeadColor = a.getColor( R.styleable.TimeLineView_timelineHeadColor Color.parseColor("#25ae5f")); // центр темный timelineHeadColorEdge = a.getColor( R.styleable.TimeLineView_timelineHeadColorEdge timelineOtherColor = a.getColor( R.styleable.TimeLineView_timelineOtherColor, Color.parseColor("#cccccc")); timelineWidth = (int) a.getDimension( R.styleable.TimeLineView_timelineWidth, marginTop = (int) a.getDimension( R.styleable.TimeLineView_timelineMarginTop, convertDIP2PX(context, 50)); a.recycle(); mPaint = new Paint(); mPaint.setAntiAlias(true); } @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) { // Перо установлено в виде пустотелого canvas.drawCircle(viewWidth, timelineHeadRadius + marginTop, радиус_времени, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5.0f); // Рисование окружности вокруг первого узла mPaint.setColor(timelineHeadColorEdge); canvas.drawCircle(viewWidth, timelineHeadRadius + marginTop, радиус_головки_времени, mPaint); // настройка цвета кисти, цвет для рисования других временных узлов mPaint.setColor(цвет_других_временных_узлов); // настройка кисти на сплошную mPaint.setStyle(Paint.Style.FILL); /** * нарисовать ось первого узла */ canvas.drawRect(new Rect(viewWidth - ширина_времени / 2, (int) (2 * радиус_головки_времени + отступ_верхний) + 5, viewWidth + ширина_времени / 2, (int) (2 * радиус_головки_времени + расстояние_радиусов_времени + отступ_верхний + 5)), mPaint); continue; } /** * нарисовать узлы временной оси, то есть нарисовать круги координаты x всех кругов одинаковы, середина view * вычисление координаты y центра круга основано на положении узла, например: y первого узла основано на расстоянии первого узла от верхнего края加上 радиус первого узла * :радиус_головки_времени + отступ_верхний *其余的点就是在节点的y的基础上,加上两倍半径和节点之间的轴的长度*节点数:(2 * радиус_времени + * расстояние_радиусов_времени) * (j - 1) + радиус_головки_времени - * радиус_времени + отступ_верхний * */ canvas.drawCircle(viewWidth, (2 * радиус_времени + расстояние_радиусов_времени) * (j - 1) + 2 * радиус_головки_времени - радиус_времени + отступ_верхний, радиус_времени, mPaint); /** * нарисовать остальные оси left: каждый ось от левого края одинаково центр оси времени - 1/2 ширины оси времени viewWidth - * ширина_времени / 2 top: (int) (j * (2 * радиус_времени + * timelineRadiusDistance) - timelineRadiusDistance + 2 * * (timelineHeadRadius-timelineRadius)+ marginTop) * right: каждый ось от правого края одинаково отстоят друг от друга центр оси времени + 1/2 ширины оси времени viewWidth + * timelineWidth / 2 bottom: (int) (j * (2 * timelineRadius + * timelineRadiusDistance) + 2 * * (timelineHeadRadius-timelineRadius)+ marginTop) */ 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)); } }
Это конец статьи, я надеюсь, что она поможет вам в изучении, также希望大家多多支持呐喊教程。
Заявление: содержимое статьи взято из Интернета, авторские права принадлежат соответствующему автору, материалы предоставлены пользователями Интернета, сайт не имеет права собственности, не прошел редактирование, не несет ответственности за связанные с этим法律责任. Если вы обнаружите материалы,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. При подтверждении факта нарушения сайт немедленно удаляет материалы,涉嫌侵权.