在Android中实现一个定制的drawable
我试图在安卓系统中获得2D图形。 作为一个例子,我想实现一个定制的drawable,并在我的活动中显示它 我已经通过扩展Android drawable定义了一个定制的drawable,如下所述在Android中实现一个定制的drawable,android,Android,我试图在安卓系统中获得2D图形。 作为一个例子,我想实现一个定制的drawable,并在我的活动中显示它 我已经通过扩展Android drawable定义了一个定制的drawable,如下所述 class myDrawable extends Drawable { private static final String TAG = myDrawable.class.getSimpleName(); private ColorFilter cf; @Override
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);
}
}
但是当我运行应用程序时,我在活动中没有看到矩形,有人能帮我吗?
我哪里出错了?您的问题在
getOpacity()
方法中。100不是有效值。您应该使用一个值。另外,您应该在构造函数中创建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\u width=“42dip”
layout\u height=“42dip”
,如果使用Java布局,则将布局参数设置为某个值)。一些视图
类型处理未实现的getInquired*
比其他类型,请尝试它们!这包括一个直接的视图
如果没有特定的宽度或高度,可以尝试返回-1
很难说这个问题是否得到了解决,但我通过谷歌来到这里,试图帮助自己记住制作自定义
可绘制的细节,另外我想帮助人们避免这种情况:我做了casey提到的更改,但我仍然看不到在我的视图上绘制的任何有效内容。另一个问题是,您似乎从未将ImageView
添加到LinearLayout
。需要添加laybj.addView(imageView)
在onCreate()
的末尾,我已经将imageView添加到线性布局中,这基本上是xml中设置边界的问题,我硬编码了图像视图的宽度和高度,现在它显示出来了,所以我的设置边界有问题吗?是否可以将图像嵌入圆角矩形或我绘制的任何基本形状中,说多边形还是路径?如果可以,请共享代码?如果覆盖draw()
方法,您可以在画布上绘制任何您想要的内容。