2010-06-03 15 views
11

Próbowałem uzyskać grafikę 2D w systemie Android. Jako przykład chcę zaimplementować niestandardową rozciągliwej i pokazać go w mojej działalnościImplementowanie niestandardowego losowania w systemie Android

I zdefiniowano dostosowane rozciągliwej rozszerzając z Android rozciągliwej jak wspomniano poniżej

class myDrawable extends Drawable { 

    private static final String TAG = myDrawable.class.getSimpleName(); 
    private ColorFilter cf; 
    @Override 
    public void draw(Canvas canvas) { 


    //First you define a colour for the outline of your rectangle 

    Paint rectanglePaint = new Paint(); 
    rectanglePaint.setARGB(255, 255, 0, 0); 
    rectanglePaint.setStrokeWidth(2); 
    rectanglePaint.setStyle(Style.FILL); 

    //Then create yourself a Rectangle 
    RectF rectangle = new RectF(15.0f, 50.0f, 55.0f, 75.0f); //in pixels 


    Log.d(TAG,"On Draw method"); 
    // TODO Auto-generated method stub 
    Paint paintHandl = new Paint(); 
    // paintHandl.setColor(0xaabbcc); 
    paintHandl.setARGB(125, 234, 213, 34); 
    RectF rectObj = new RectF(5,5,25,25); 
    canvas.drawRoundRect(rectangle, 0.5f, 0.5f, rectanglePaint); 

    } 

    @Override 
    public int getOpacity() { 
    // TODO Auto-generated method stub 
    return 100; 
    } 

    @Override 
    public void setAlpha(int alpha) { 
    // TODO Auto-generated method stub 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
    // TODO Auto-generated method stub 
    this.cf = cf; 
    } 
} 

Próbuję uzyskać ten wyświetlany w moja aktywność, jak pokazano poniżej

public class custDrawable extends Activity { 
/** Called when the activity is first created. */ 


LinearLayout layObj = null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     layObj = (LinearLayout) findViewById(R.id.parentLay); 
     ImageView imageView = (ImageView) findViewById(R.id.icon2); 
     myDrawable myDrawObj = new myDrawable(); 
     imageView.setImageDrawable(myDrawObj); 
     imageView.invalidate(); 
// layObj.addView(myDrawObj, params); 

    } 
} 

Ale gdy uruchamiam aplikację nie widzę prostokąt o działalności, może ktoś mi pomóc? Gdzie się mylę?

Odpowiedz

11

Twój problem jest w metodzie getOpacity(). 100 nie jest prawidłową wartością. Powinieneś użyć wartości PixelFormat. Powinieneś również utworzyć w konstruktorze swoje RectF i Paint, a następnie dostosować wartości w draw(), aby nie tworzyć tylu obiektów, które wymagają zebrania śmieci. Tak:

public class Square extends Drawable 
{ 
    private final Paint mPaint; 
    private final RectF mRect; 

    public Square() 
    { 
     mPaint = new Paint(); 
     mRect = new RectF(); 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     // Set the correct values in the Paint 
     mPaint.setARGB(255, 255, 0, 0); 
     mPaint.setStrokeWidth(2); 
     mPaint.setStyle(Style.FILL); 

     // Adjust the rect 
     mRect.left = 15.0f; 
     mRect.top = 50.0f; 
     mRect.right = 55.0f; 
     mRect.bottom = 75.0f; 

     // Draw it 
     canvas.drawRoundRect(mRect, 0.5f, 0.5f, mPaint); 
    } 

    @Override 
    public int getOpacity() 
    { 
     return PixelFormat.OPAQUE; 
    } 

    @Override 
    public void setAlpha(int arg0) 
    { 
    } 

    @Override 
    public void setColorFilter(ColorFilter arg0) 
    { 
    } 
} 
+0

Zrobiłem zmiany wspomniane przez Casey, ale nadal nie widzę żadnych ważnych rzeczy narysowanych na moim widoku. – Girish

+0

Kolejnym problemem jest to, że nigdy nie dodajesz 'ImageView' do twojego' LinearLayout'. Musisz dodać 'layObj.addView (imageView);' na końcu 'onCreate()' – CaseyB

+0

Dodałem imageView do układu liniowego, jest to w zasadzie problem z ustawionymi granicami W xml, ustawiłem na sztywno szerokość i wysokość widoku obrazu, teraz jest wyświetlany, więc jakiś problem z moimi setBounds to jest? – Girish

0

Być może trzeba będzie wdrożyć inne przesłonięcia jak getIntrinsicWidth() i getIntrinsicHeight(). Jednym ze sposobów odróżnienia jest to, że ustawiasz szerokość layout_width i layout_height na pewną stałą (layout_width = "42dip" layout_height = "42dip" w XML lub ustawiasz wartość layoutParams na pewną wartość, jeśli używasz układów Java). Niektóre typy widoków radzą sobie bez implementacji getIntrinsic * niż inne, więc wypróbuj je! Obejmuje to prosty widok

Możesz spróbować zwrócić wartość -1, jeśli nie ma określonej szerokości ani wysokości.

Trudno powiedzieć, czy problem kiedykolwiek został rozwiązany, ale mam tutaj poprzez Google stara się pomóc sobie zapamiętać szczegóły wykonaniem niestandardowego rozciągliwej, plus Chcę pomóc ludziom uniknąć w ten sposób: http://xkcd.com/979/

Powiązane problemy