2010-07-16 117 views
1

我的自定义视图看起来如下自定义图像视图的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)

如果我尝试运行它,应用程序崩溃。如果我取消注释可绘制的方式,那么它可以工作,但其他布局不显示。

任何帮助表示赞赏。

回答

1

所有你需要做的就是看看你所看到的例外。

NoSuchMethodException:com.mypackage.CustomDrawableView(Android.context.Context, Android.util.AttributeSet)

这意味着有与签名com.mypackage.CustomDrawableView.(Android.context.Context, Android.util.AttributeSet)没有方法,因为你还没有在你的课堂上重写它。

+0

是的,这有帮助,但调用方法被调用,然后布局被绘制,这就是为什么我的自定义graphichs被正常的布局图覆盖。有没有一种叫做afterDraw的方法? – mynameisanthpny 2010-07-17 11:14:46

+0

你应该重写'View'而不是'ImageView'。这应该解决问题。 – CaseyB 2010-07-17 16:29:41

3

您可以通过实施缺少的构造函数来修复它。当你尝试从XML实例化它时,它被调用。

public CustomDrawableView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
}