2015-04-20 46 views
0

我創建的自定義視圖稱爲DrawViewSource類延伸View:發生在線路canvas.drawBitmap(...)如何繪製位圖中一個自定義視圖中的非活動類

Paint paint; 
    Location location; 

    public DrawViewSource(Context context) { 
     super(context); 
     init(); 
    } 

    public DrawViewSource(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 

    } 

    public DrawViewSource(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    private void init() { 
     paint = new Paint(); 
//  paint.setColor(Color.YELLOW); 
//  paint.setStrokeWidth(10); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.source_icon); 
     canvas.drawBitmap(image, location.position_x, location.position_y, paint); 

    } 
} 

錯誤。我看到一個像我的onDraw()這樣的實現,作者說它的工作,我讀到這個實現只能在Activity類中完成。我現在困惑。

不介意類Location,它沒有錯誤。

我是否缺少一行代碼?該怎麼做,請賜教。

編輯:

04-21 07:49:58.938 26707-26707/com.myapp.alphasickbro.roomfindr E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.myapp.alphasickbro.roomfindr, PID: 26707 
    java.lang.NullPointerException 
      at com.myapp.alphasickbro.roomfindr.DrawViewSource.onDraw(DrawViewSource.java:47) 
      at android.view.View.draw(View.java:14740) 
      at android.view.View.getDisplayList(View.java:13636) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.draw(View.java:14743) 
      at android.view.View.getDisplayList(View.java:13636) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.draw(View.java:14743) 
      at android.widget.FrameLayout.draw(FrameLayout.java:472) 
      at android.widget.HorizontalScrollView.draw(HorizontalScrollView.java:1838) 
      at android.view.View.getDisplayList(View.java:13636) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.draw(View.java:14743) 
      at android.widget.FrameLayout.draw(FrameLayout.java:472) 
      at android.widget.ScrollView.draw(ScrollView.java:1831) 
      at android.view.View.getDisplayList(View.java:13636) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.getDisplayList(View.java:13631) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.support.v4.widget.DrawerLayout.drawChild(DrawerLayout.java:1060) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.getDisplayList(View.java:13631) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.draw(View.java:14743) 
      at android.widget.FrameLayout.draw(FrameLayout.java:472) 
      at android.view.View.getDisplayList(View.java:13636) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.getDisplayList(View.java:13631) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.getDisplayList(View.java:13631) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.getDisplayList(View.java:13631) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.View.draw(View.java:14457) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3117) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2954) 
      at android.view.View.draw(View.java:14743) 
      at android.widget.FrameLayout.draw(FrameLayout.java:472) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2329) 
      at android.view.View.getDisplayList(View.java:13636) 
      at android.view.View.getDisplayList(View.java:13678) 
      at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1570) 
      at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1449) 
      at android.view.ViewRootImpl.draw(ViewRootImpl.java:2408) 
      at android.view.ViewRootImpl. 

這裏就是我創建Location()

Location loc; 

    public CustomOnItemSelectedListener(MainActivity mac) { 
     this.mac=mac; 
    } 

    public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) { 
     if (pos == 0) { 
      loc= new Location(1322,227); 
      mac.dvs.invalidate(); 
     } 

//  Toast.makeText(parent.getContext(), "OnItemSelectedListener : " + parent.getItemAtPosition(pos).toString(), Toast.LENGTH_SHORT).show(); 
    } 

這是我Location類的樣子:

public float position_x,position_y; 

public Location(float position_x, float position_y) { 
    this.position_x = position_x; 
    this.position_y = position_y; 
} 
+0

你遇到什麼樣的錯誤?請發佈堆棧跟蹤。 – AndroidEx

回答

0

它可能爲空指針例外在你的getResources()方法。以下是在自定義視圖中繪製位圖的可行示例。

public class DrawViewSource extends View { 

private Paint mPaint; 
private Resources resources; 
private Bitmap bitmap; 

public DrawViewSource(Context context) { 
    // TODO Auto-generated constructor stub 
    super(context); 
    init(context, null, 0); 
} 

public DrawViewSource(Context context, AttributeSet attrs) { 
    // TODO Auto-generated constructor stub 
    super(context, attrs); 
    init(context, attrs, 0); 
} 

public DrawViewSource(Context context, AttributeSet attrs, int defStyleAttr) { 
    // TODO Auto-generated constructor stub 
    super(context, attrs, defStyleAttr); 
    init(context, attrs, defStyleAttr); 
} 

private void init(Context context, AttributeSet attrs, int defStyleAttr) { 
    // TODO Auto-generated method stub 
    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    resources = context.getResources(); 
    bitmap = BitmapFactory 
      .decodeResource(resources, R.drawable.ic_launcher); 
} 

@SuppressLint("NewApi") 
public DrawViewSource(Context context, AttributeSet attrs, 
     int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    // TODO Auto-generated constructor stub 
} 

/* 
* (non-Javadoc) 
* 
* @see android.view.View#onDraw(android.graphics.Canvas) 
*/ 
@Override 
protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.onDraw(canvas); 

    canvas.drawBitmap(bitmap, 0, 0, mPaint); 
} 
} 

並在您的佈局中使用上述自定義視圖,如下所示。

<com.example.DrawViewSource 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" /> 
+0

謝謝。你能看看我更新的帖子嗎?我清楚地編碼。 – yologaming

0

因爲您沒有確切位置,您是否調試過它?

(location.position_x,location.position_y)

設設置調試點:

canvas.drawBitmap(圖像,location.position_x,location.position_y,油漆); 然後以調試模式運行應用程序。當代碼運行到上面的行時,然後將鼠標移到所有變量上以檢查哪裏是空的?

相關問題