ploglin 發表於 2012-8-24 15:24
recycle() 的用法沒錯,會變成null代表早就不存在或被釋放。
或者,你可以說明一下,你實際要做的功能,大 ...
我是先用一個主要activity當作基底(是其他圖片的father) 再用setcontentView貼上其他的圖片java黨 就像這個MenuView來切換畫面 因為是動態的畫面
這是我的第一張圖MenuView是一個JAVA黨 還有下面MenuDrawThread 好像是刷新圖片的吧 也是個java黨
因為我不太懂所以是造著書上的SAMPLE去做的...不知道是不是搞砸了
後面還有很多張圖 都是這兩種類的JAVA黨去做的 在基底activity設定rect 只要點到該畫面的該rect就會做動作或切換貼上另一張圖 一直下去 超過50M 就會出現OOM的錯誤
而且我觀察LOGCAT她一開始貼上第一張圖就超過14M 一直貼圖就會慢慢累加到報表 我都有把不到的圖層java黨設成NULL 但只會只會淺少一點 抵不過增加的記憶體...
package com.example.test03;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MenuView extends SurfaceView implements SurfaceHolder.Callback
{
Test1 father; //Activity的引用
MenuDrawThread mdt; //後臺重繪執行緒
Bitmap bmpback; //背景圖片
Bitmap bmpt11b; //test1button pic
Bitmap bmpt12b;
Bitmap bmpt13b;
Bitmap bmpt2b;
Bitmap bmpt3b;
Bitmap bmpsignin;
Bitmap bmptopic; //topic pic
public MenuView(Test1 father)
{
super(father);
getHolder().addCallback(this);
this.father = father;
mdt = new MenuDrawThread(this,getHolder()); //新建WelcomeDrawThread物件
initBitmap(father); //初始化圖片
}
public void initBitmap(Context context)
{
Resources r = context.getResources(); //獲取Resources物件
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
bmpback = BitmapFactory.decodeResource(r, R.drawable.menuback , options);
bmpt11b = BitmapFactory.decodeResource(r, R.drawable.eyebutton , options);
bmpt12b= BitmapFactory.decodeResource(r, R.drawable.earbutton , options);
bmpt13b = BitmapFactory.decodeResource(r, R.drawable.eyeearbutton , options);
}
public void doDraw(Canvas canvas) //方法:用於根據不同狀態繪製螢幕
{
//Paint paint = new Paint(); //新建畫筆
canvas.drawBitmap(bmpback, 0, 0, null);
if(father.flag1)
{
canvas.drawBitmap(bmpt11b, 250 , 250, null);
}
if(father.flag2)
{
canvas.drawBitmap(bmpt12b, 250 , 400, null);
}
if(father.flag3)
{
canvas.drawBitmap(bmpt13b, 250, 550, null);
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
//覆寫surfaceChanged方法
}
public void surfaceCreated(SurfaceHolder holder)
{ //覆寫surfaceCreated方法
if(!mdt.isAlive()){ //啟動後臺繪製執行緒
mdt.start();
}
}
public void surfaceDestroyed(SurfaceHolder holder)
{ //覆寫surfaceDestroyed方法
if(mdt.isAlive()){ //停止後臺繪製執行緒
mdt.flag = false;
}
}
}
package com.example.test03;
import android.graphics.Canvas; //引入相關類別
import android.view.SurfaceHolder; //引入相關類別
/*
* 該類別繼承自Thread,主要負責定時更新WelcomeView
*/
public class MenuDrawThread extends Thread{
MenuView father; //WelcomeView物件的引用
SurfaceHolder surfaceHolder; //WelcomeView物件的SurfaceHolder
int sleepSpan = 100; //休眠時間
boolean flag; //執行緒執行旗標位元
//建構式:初始化主要的成員變數
public MenuDrawThread(MenuView father,SurfaceHolder surfaceHolder){
this.father = father;
this.surfaceHolder = surfaceHolder;
this.flag = true;
}
//方法:執行緒執行方法
public void run(){
Canvas canvas = null; //新建一個Canvas物件
while(flag){
try{
canvas = surfaceHolder.lockCanvas(null);//為畫布加鎖
synchronized(surfaceHolder){
father.doDraw(canvas); //重新繪製螢幕
}
}
catch(Exception e){
e.printStackTrace();//捕獲異常並列印
}
finally{
if(canvas != null){//釋放畫布並將其傳回
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
try{
Thread.sleep(sleepSpan); //休眠一段時間
}
catch(Exception e){
e.printStackTrace(); //捕獲異常並列印
}
}
}
}
|