自定义图像视图的Android
问题描述:
我的自定义视图看起来如下自定义图像视图的Android
package com.mypackage;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RectShape;
import android.widget.ImageView;
public class CustomDrawableView extends ImageView {
// private ShapeDrawable mDrawable;
public int imageid = 0;
ShapeDrawable bgDrawable = null;
List<ShapeDrawable> ls = new ArrayList<ShapeDrawable>();
final int COUNT_SUMMERY = 3;
final int VERTICAL_OFFSET = 200;
final int HORIZENTAL_OFFSET = 20;
final int HORIZENTAL_GAP = 85;
final int VERTICAL_Y_POINT = 15;
final int VERTICAL_MAX_HEIGHT = 195;
final int HORIZENTAL_WIDTH = 60;
final int percentage[] = {25, 40, 35};
public CustomDrawableView(Context context, int id) {
super(context);
imageid = id;
switch(id) {
case R.drawable.summarychart:
for(int i = 0; i < COUNT_SUMMERY; i++) {
int x = HORIZENTAL_OFFSET + (HORIZENTAL_GAP * i);
int width = HORIZENTAL_WIDTH;
int height = VERTICAL_MAX_HEIGHT * percentage[i]/100;
int y = VERTICAL_OFFSET + VERTICAL_Y_POINT + VERTICAL_MAX_HEIGHT - height;
ShapeDrawable objDrawable = new ShapeDrawable(new RectShape());
int color = 0;
switch(i) {
case 0:
color = Color.RED;
break;
case 1:
color = Color.GREEN;
break;
case 2:
color = Color.YELLOW;
break;
}
objDrawable.getPaint().setColor(color);
objDrawable.setBounds(x, y, x + width, y + height);
ls.add(objDrawable);
}
break;
default:
break;
}
int x = 0;
int y = 0;
int width = 320;
int height = 480;
bgDrawable = new ShapeDrawable(new RectShape());
bgDrawable.getPaint().setColor(0xffffffff);
bgDrawable.setBounds(x, y, x + width, y + height);
}
protected void onDraw(Canvas canvas) {
/* // Draw the white background
// bgDrawable.draw(canvas);
// Draw the bitmaps
Bitmap bmp = BitmapFactory.decodeResource(getResources(), imageid);
canvas.drawBitmap(bmp, 0, VERTICAL_OFFSET, null);
*/ // Draw bars
super.onDraw(canvas);
for(int i = 0; i < COUNT_SUMMERY; i++) {
ShapeDrawable objDrawable = ls.get(i);
objDrawable.draw(canvas);
}
}
}
而在布局我有:
<com.mypackage.CustomDrawableView
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/mychart" />
但是我看到消息:
NoSuchMeth odException:com.mypackage.CustomDrawableView。(Android.context.Context,Android.util.AttributeSet)
如果我尝试运行它,应用程序崩溃。如果我取消注释可绘制的方式,那么它可以工作,但其他布局不显示。
任何帮助表示赞赏。
答
所有你需要做的就是看看你所看到的例外。
NoSuchMethodException:com.mypackage.CustomDrawableView(Android.context.Context, Android.util.AttributeSet)
这意味着有与签名com.mypackage.CustomDrawableView.(Android.context.Context, Android.util.AttributeSet)
没有方法,因为你还没有在你的课堂上重写它。
答
您可以通过实施缺少的构造函数来修复它。当你尝试从XML实例化它时,它被调用。
public CustomDrawableView(Context context, AttributeSet attrs) {
super(context, attrs);
}
是的,这有帮助,但调用方法被调用,然后布局被绘制,这就是为什么我的自定义graphichs被正常的布局图覆盖。有没有一种叫做afterDraw的方法? – mynameisanthpny 2010-07-17 11:14:46
你应该重写'View'而不是'ImageView'。这应该解决问题。 – CaseyB 2010-07-17 16:29:41