Внедрение настраиваемого на Android

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

Я определил индивидуальный чертеж, простирающийся от Android, как указано ниже

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

    }
}

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

Ответ 1

Ваша проблема в методе 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)
    {
    }
}

Ответ 2

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

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

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