2017-02-03 11 views
2

私は、アプリケーションの実行時に正しくレンダリングされるカスタムビュー(円)を持っています。ただし、XMLプレビューウィンドウで表示すると、ビューが正しく配置されません。カスタムビューがXMLプレビューでのみ正しくアライメントされない

以下は、位置合わせが正しくないプレビューウィンドウのスクリーンショットです。以下

enter image description here

実行アプリに描かれている正確な位置合わせと同じビューのスクリーンショットです。ここで

enter image description here

カスタムビューを定義するコードです -

public class LinearTimerView extends View { 

    private Paint arcPaint; 
    private RectF rectF; 

    private int initialColor; 
    private int progressColor; 
    private int circleRadiusInDp; 

    // The point from where the color-fill animation will start. 
    private int startingAngle = 270; 

    // The point up-till which user wants the circle to be pre-filled. 
    private float preFillAngle; 

    public LinearTimerView(Context context, 
          AttributeSet attrs) { 
     super(context, attrs); 

     TypedArray typedArray = getContext().obtainStyledAttributes(attrs, 
       R.styleable.LinearTimerView); 

     // Retrieve the view attributes. 
     this.circleRadiusInDp = 
       (int) typedArray.getDimension(R.styleable.LinearTimerView_radius, 5); 
     int strokeWidthInDp = 
       (int) typedArray.getDimension(R.styleable.LinearTimerView_strokeWidth, 2); 
     this.initialColor = 
       typedArray.getColor(R.styleable.LinearTimerView_initialColor, 
         ContextCompat.getColor(getContext(), R.color.colorInitial)); 
     this.progressColor = 
       typedArray.getColor(R.styleable.LinearTimerView_progressColor, 
         ContextCompat.getColor(getContext(), R.color.colorProgress)); 
     this.startingAngle = 
       typedArray.getInt(R.styleable.LinearTimerView_startingPoint, 270); 

     // Define the size of the circle. 
     rectF = new RectF(
       (int) convertDpIntoPixel(strokeWidthInDp), 
       (int) convertDpIntoPixel(strokeWidthInDp), 
       (int) convertDpIntoPixel(circleRadiusInDp * 2) 
         + (int) convertDpIntoPixel(strokeWidthInDp), 
       (int) convertDpIntoPixel(circleRadiusInDp * 2) 
         + (int) convertDpIntoPixel(strokeWidthInDp)); 

     arcPaint = new Paint(); 
     arcPaint.setAntiAlias(true); 
     arcPaint.setStyle(Paint.Style.STROKE); 
     arcPaint.setStrokeWidth((int) convertDpIntoPixel(strokeWidthInDp)); 

     typedArray.recycle(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     try { 
      // Grey Circle - This circle will be there by default. 
      arcPaint.setColor(initialColor); 
      canvas.drawCircle(rectF.centerX(), rectF.centerY(), 
        (int) convertDpIntoPixel(circleRadiusInDp), arcPaint); 

      // Green Arc (Arc with 360 angle) - This circle will be animated as time progresses. 
      arcPaint.setColor(progressColor); 
      canvas.drawArc(rectF, startingAngle, preFillAngle, false, arcPaint); 
     } catch (NullPointerException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    /** 
    * Method to get the degrees up-till which the arc is already pre-filled. 
    * @return 
    */ 
    public float getPreFillAngle() { 
     return preFillAngle; 
    } 

    public void setPreFillAngle(float preFillAngle) { 
     this.preFillAngle = preFillAngle; 
    } 

    /** 
    * Method to get the starting point of the angle 
    * @return 
    */ 
    public int getStartingPoint() { 
     return startingAngle; 
    } 

    public void setStartingPoint(int startingPointInDegrees) { 
     this.startingAngle = startingPointInDegrees; 
    } 

    /** 
    * Method to convert DPs into Pixels. 
    */ 
    private float convertDpIntoPixel(float dp) { 
     float scale = getResources().getDisplayMetrics().density; 
     return dp * scale + 0.5f; 
    } } 

私はこれをどのように修正すればよいですか?

+2

私が考えることができる理由の1つは、ビューがランタイム測定に依存している場合、プレビュープレーンで正しく表示されないことです。 –

+0

@hardikmはい、それはもっともらしい説明であるようです。 –

+2

あなたのプレビューはNexus 4です。あなたはNexus 5Xを使いました。他のプレビュー画面を見て、レイアウトの問題を検出してください –

答えて

1

私はonMeasure()メソッドをオーバーライドしていませんでした。

私はヒントフォームthisを受け取り、問題を解決できました。

関連する問題