Реализация настраиваемого рисования в Android

Я пытался заполучить 2D-графику в Android. В качестве примера я хочу реализовать собственный чертеж и показать его в своей деятельности

Я определил настраиваемое рисование, расширяясь от Android Drawable, как упомянуто ниже

 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;
   }
 }

Я пытаюсь отобразить это в своей деятельности, как показано ниже

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);

    }
}

Но когда я запускаю приложение, я не вижу прямоугольника на активности, кто-нибудь может мне помочь? Куда я иду не так?

2 ответа

Ваша проблема в getOpacity() метод. 100 не является допустимым значением. Вы должны использовать значение PixelFormat. Кроме того, вы должны создать свой RectF а также Paint в конструкторе, а затем просто настроить значения в draw() так что вы не создаете так много объектов, которые нуждаются в сборке мусора. Как это:

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)
    {
    }
}

Возможно, вам придется реализовать другие переопределения, такие как getIntrinsicWidth() и getIntrinsicHeight(). Один из способов сказать, что вы задаете для layout_width и layout_height некоторую константу (layout_width="42dip" layout_height="42dip" в XML или задаете для layoutParams какое-то значение, если вы используете макеты Java). Некоторые типы View обрабатывают не реализованный getIntrinsic*, чем другие, поэтому попробуйте их! Это включает в себя прямой вид

Вы можете попробовать вернуть -1, если нет определенной ширины или высоты.

Трудно сказать, удалось ли решить проблему, но я попал сюда через Google, пытаясь помочь себе вспомнить детали создания пользовательского Drawable, плюс я хочу помочь людям избежать этого: http://xkcd.com/979/

Другие вопросы по тегам