English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
淘宝物流信息TimeLineの作成方法:
模倣の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, Color.parseColor("#b9e5cc"); // 端辺浅色 timelineOtherColor = a.getColor( R.styleable.TimeLineView_timelineOtherColor, Color.parseColor("#cccccc"); 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); } @Override protected void onDraw(Canvas canvas) { // デフォルトで時間軸の位置はビューの中央に設定 viewWidth = getMeasuredWidth() / 2; // 最初のノードの色を設定 mPaint.setColor(timelineHeadColor); /** * 時間軸のノード数に応じて、対応するノードと軸を描画 */ for (int j = 1; j <= timelineCount; j++) { /** * 当j==1、最初のノードを描画する際は特別な処理が必要で、ノードの外側にさらに円環を追加する必要があります */ if (j == 1) { // ペンを線に設定 キャンバス.drawCircle(viewWidth, timelineHeadRadius + marginTop, timelineRadius, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5.0f); // 最初のノードの周りの円環を描画 mPaint.setColor(timelineHeadColorEdge); キャンバス.drawCircle(viewWidth, timelineHeadRadius + marginTop, timelineHeadRadius, mPaint); // ペン色を設定、他の時間节点の色を描画 mPaint.setColor(timelineOtherColor); // ペンを塗りつぶしに設定 mPaint.setStyle(Paint.Style.FILL); /** * 最初のノードの下の軸を描画 */ キャンバス.drawRect(new Rect(viewWidth - timelineWidth / 2, (int) (2 * timelineHeadRadius + marginTop) + 5, viewWidth + timelineWidth / 2, (int) (2 * timelineHeadRadius + timelineRadiusDistance + marginTop + 5)) mPaint); continue; } /** * 時間軸のノードを描画します、つまり円形を描画します 円心のxはすべて同じで、ビューの中央 * 円心のyの計算は、ノードの位置に基づいて行われます、例えば:最初のノードのyは、最初のノードの上からの距離に最初のノードの半径を加算したものです * :timelineHeadRadius + marginTop * 残りのノードは、ノードのyの基础上、2倍の半径とノード間の軸の長さ×ノード数に加算されます:(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) */ 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(メールを送信する際、#を@に置き換えてください。告発を行い、関連する証拠を提供してください。一旦確認が取れましたら、このサイトは直ちに侵害される可能性のある内容を削除します。)