English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تقليد Android TimeLineView معلومات الشحن لتأمين Taobao

طريقة إنتاج 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) {
 // إعداد موقع المحور الزمني في منتصف الرؤية بشكل افتراضي
 viewWidth = getMeasuredWidth() / 2;
 // إعداد لون النقطة الأولى
 mPaint.setColor(timelineHeadColor);
 /**
  * بناءً على عدد نقاط المحور الزمني، أرسم النقاط والمحور المتبادل
  */
 for (int j = 1; j <= timelineCount; j++) {
  /**
  * عند j==1، عند رسم النقطة الأولى، هناك شيء خاص، نحتاج إلى إضافة حلقة أخرى حول النقطة
  */
  if (j == 1) {
  // إعداد قلم الرسم كحلقة داخلية
  canvas.drawCircle(viewWidth, timelineHeadRadius + marginTop,
   راديوس الوقت, الرسم);
  mPaint.setStyle(Paint.Style.STROKE);
  mPaint.setStrokeWidth(5.0f);
  // يرسم دائرة الحلقة الخارجية للنقطة الأولى
  mPaint.setColor(timelineHeadColorEdge);
  canvas.drawCircle(viewWidth, timelineHeadRadius + marginTop,
   راديوس رأس الوقت, الرسم);
  // ضبط لون قلم الرسم لرسم ألوان النقاط الوقت الأخرى
  mPaint.setColor(timelineOtherColor);
  // ضبط قلم الرسم كامل
  mPaint.setStyle(Paint.Style.FILL);
  /**
   * رسم المحاور السفلية للنقطة الأولى
   */
  canvas.drawRect(new Rect(viewWidth - عرض الوقت / 2,
   (إعداد) (2 * راديوس رأس الوقت + المروحة العلوية) + 5,
   viewWidth + عرض الوقت / 2, (إعداد) (2
    * راديوس رأس الوقت + مسافة بعد راديوس الوقت
    + المروحة العلوية + 5)), الرسم);
  continue;
  }
  /**
  * رسم نقاط الوقت، أي رسم دائرة النقاط، x المركز للنقاط جميعها متساوية، في منتصف الرؤية
  * حساب العلو للنقطة في وسط النقطة بناءً على موقع النقطة، على سبيل المثال: y للنقطة الأولى هي المسافة بين النقطة الأولى والنقطة العلوية بالإضافة إلى راديوس النقطة الأولى
  * : راديوس رأس الوقت + المروحة العلوية
  * النقاط الباقية هي على قاعدة النقطة، بالإضافة إلى ضعف راديوس النقطة و طول المحاور بين النقاط * عدد النقاط: (2 * راديوس الوقت +
  * (مسافة بعد راديوس الوقت) * (ج - 1) + راديوس رأس الوقت -
  * راديوس الوقت + المروحة العلوية
  * 
  */
  canvas.drawCircle(viewWidth,
   (2 * راديوس الوقت + مسافة بعد راديوس الوقت) * (ج - 1) + 2
    * راديوس رأس الوقت - راديوس الوقت + المروحة العلوية ,
   راديوس الوقت, الرسم);
  /**
  * رسم الباقي من المحاور الأفقية left: كل محور من المحاور يبعد نفس المسافة عن اليسار    مركز محور الوقت - نصف عرض محور الوقت viewWidth -
  * عرض الوقت / 2 العلو: (إعداد) (ج * (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 (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وتقديم الأدلة ذات الصلة، وإذا تم التحقق من ذلك، فإن هذا الموقع سيقوم بإزالة المحتوى المشبوه في انتهاك حقوق النسخ.

أنت قد تحب