2013-07-01 40 views
3

我試圖從資源中創建一個位圖並在其上繪製一個簡單的文本。代碼編譯並運行,但是當我點擊該應用程序在AVD中崩潰時,是問題從資源獲取的位圖上繪製文本

package apc.examples; 

import android.os.Bundle; 
import android.os.Environment; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.view.Menu; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_about_me); 

    } 
    public void showAboutMessage(View v) 
    { 

     Bitmap marked= BitmapFactory.decodeResource(getResources(), R.drawable.my_image); 
     ImageView portrait = (ImageView) findViewById(R.id.imageView1); 
     Canvas canvas = new Canvas(marked); 
     canvas.drawBitmap(marked, 0, 0, null); 
    Paint paint = new Paint(); 
      paint.setColor(Color.WHITE); 
       paint.setTextSize(10); 
      canvas.drawText("asfasf",0, 0, paint); 
      portrait.setImageBitmap(marked); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.about_me, menu); 
     return true; 
    } 

} 

回答

1

資源位圖是不可變的。在寫入之前,您應該將其複製到可變位圖上。下面是從this tutorial:

Bitmap marked= BitmapFactory.decodeResource(getResources(), R.drawable.my_image); 

    android.graphics.Bitmap.Config bitmapConfig = 
     marked.getConfig(); 
    // set default bitmap config if none 
    if(bitmapConfig == null) { 
    bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888; 
    } 
    // resource bitmaps are imutable, 
    // so we need to convert it to mutable one 
    bitmap = bitmap.copy(bitmapConfig, true); 
+0

我應該在使用BitmapFactory解碼資源之前引入此代碼?解碼後將其置於 – techno

+0

之後 – HalR

0

爲了節省一些內存的代碼片段,而不是解碼和複製,你應該輸入的可變參數爲BitmapFactory.OptionBitmapFactory如下:

... 
Options opt = new BitmapFactory.Options(); 
opt.inMutable = true; 
Bitmap marked= BitmapFactory.decodeResource(getResources(), R.drawable.my_image, opt); 
... 

這應返回一個可變的,隨時可以使用和更改,Bitmap