2012-07-15 29 views
5

Özel bir View numaralı hattında bir çizgi çizmeye çalışıyorum. Burada, sadece PathShape nolu tek bir parça ile basit bir Path yarattım ve bunun için ShapeDrawable içine içine yapıştırıp onDraw() içinde Canvas içine çizim yapmak niyetindeyim. Ancak, bu işe yaramıyor. Örneğime bakın.Özel bir Görünüm üzerinde bir çizgi çizmek için bir PathShape ile ShapeDrawable'ı nasıl kullanmanız gerekir?

package com.example.test; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.drawable.ShapeDrawable; 
import android.graphics.drawable.shapes.PathShape; 
import android.util.Log; 
import android.view.View; 

public class TestView extends View { 

    private Path mPath = null; 
    private Paint mPaint = null; 
    private PathShape mPathShape = null; 
    private ShapeDrawable mShapeDrawable = null; 

    public TestView(Context context) { 
     super(context); 
    } 

    private void init() { 
     int width = this.getWidth()/2; 
     int height = this.getHeight()/2; 

     Log.d("init", String.format("width: %d; height: %d", width, height)); 

     this.mPath = new Path(); 
     this.mPath.moveTo(0, 0); 
     this.mPath.lineTo(width, height); 

     this.mPaint = new Paint(); 
     this.mPaint.setColor(Color.RED); 

     this.mPathShape = new PathShape(this.mPath, 1, 1); 

     this.mShapeDrawable = new ShapeDrawable(this.mPathShape); 
     this.mShapeDrawable.getPaint().set(this.mPaint); 
     this.mShapeDrawable.setBounds(0, 0, width, height); 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 

     // Doing this here because in the constructor we don't have the width and height of the view, yet 
     this.init(); 
    } 

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

     Log.d("onDraw", "Drawing"); 

     // This works, but won't let me do what I'm really trying to do 
     canvas.drawLine(0.0f, 0.0f, this.getWidth()/2.0f, this.getHeight()/2.0f, this.mPaint); 

     // This should work, but does not 
     //this.mPathShape.draw(canvas, this.mPaint); 

     // This should work, but does not 
     //this.mShapeDrawable.draw(canvas); 
    } 

} 

Eğer onDraw() yöntemde benim yorumlardan görebileceğiniz gibi, ne PathShape ne de ShapeDrawable kullanılarak Canvas üzerine Path gerçekten çalışan çizmek. Denediğimde hiçbir şey çizilmez. Neden olduğu hakkında bir fikri olan var mı?

Bunu test ettiğim cihaz Android 4.1.1 çalıştırıyor.

+0

Sadece meraklı - onDraw içinde yeni bir Paint nesnesi oluşturmayı denediniz. Bunu yapıyorum ve bitmapler ile başarıya ulaşıyorum ama gerekli olup olmadığından emin değildim. – JavaCoderEx

+0

OnDraw'da nesne oluşturmak istemediğimden beri yoktu (aslında Lint'ten uyarı veriyor). Ancak, şimdi denedim ve aynı sonuçları aldım. Başarı yok. – Daniel

+0

Daha fazla araştırma ve burada yanıt eksikliğinden sonra, bunun sadece kırılmış olduğunu ve bir hata raporu sunduğumu düşünüyorum. http://code.google.com/p/android/issues/detail?id=35229 – Daniel

cevap

12

Bununla ilgili iki sorun var.

Birincisi, Paint stilidir. Varsayılan Paint.Stroke.FILL, ancak bir satırda doldurulacak bir şey yok.

this.mPaint.setStyle(Paint.Style.STROKE); 

İkinci konu PathShape standart yükseklik ve genişlik doğru olmadığıdır: Bu (sayesinde, Romain Guy) ekleyin gerekiyordu. Bu konuda the documentation okudum, ama doğru anlamadı. Bu ilk sorunu çözdüğümde ortaya çıktı. Özel görünümümün yüksekliğine ve genişliğine ayarlanması (tüm görünüm boyunca çizdiğimden) bunu düzeltdi. Ayrıca ShapeDrawable'un sınırlarını eşleştirmek için değiştirmek zorunda kaldım.

this.mShapeDrawable.setBounds(0, 0, this.getWidth(), this.getHeight()); 

this.mPathShape = new PathShape(this.mPath, this.getWidth(), this.getHeight()); 

ve

Umarım bu gelecekte başkası yardımcı olur.

+0

Bunun için teşekkürler! Bende aynı sorunları vardı. –

+1

Görünmemesine yol açabilecek bir diğer sorun, yolunuzun boyutlarının maksimum en boy oranından daha büyük olması, eğer LogCat'inizde uyarılara yol açmasıdır. –