Реализация настраиваемого рисования в 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/