2010-07-16 112 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); 
}