閱讀646 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android 實現圖片的自動縮放,適應分辨率不同的手機

以下代碼可實現Android圖片按照不同屏幕手機的大小 比例縮放。

1、定義 bitmap

public Bitmap viewBg;// 背景圖

2、給他圖片資源

viewBg = BitmapFactory.decodeResource(res, R.drawable.shuaibao_bg);

3、就是正事了,自己看吧

canvas.save();
Matrix matrix=new Matrix();
int width = viewBg.getWidth();//獲取資源位圖的寬
int height = viewBg.getHeight();//獲取資源位圖的高
float w = scalX/viewBg.getWidth();
float h = scalY/viewBg.getHeight();
matrix.postScale(w, h);//獲取縮放比例
Bitmap dstbmp = Bitmap.createBitmap(viewBg,0,0,
width,height,matrix,true);//根據縮放比例獲取新的位圖
canvas.drawBitmap(dstbmp,0,0, mPaint); //在屏幕上畫出位圖
canvas.restore();


下麵是最全麵的代碼:

import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import cn.com.ldci.madc.firecrackers.R;
import cn.com.ldci.madc.firecrackers.ui.shuaibao.ShuaiBaoActivity;

public class ShuaiBaoView extends SurfaceView implements SurfaceHolder.Callback{
 
 ShuaiBaoActivity main = new ShuaiBaoActivity();
 
 //狀態
 public final static int START = 0;//摔炮開始運動
 public final static int PAUSE =1;//軟件暫停
 public final static int HIT =2;//定義摔炮撞牆是的狀態
 //監聽軟件狀態
 public  int state = PAUSE;
 //定義圖片
 public Bitmap imgBao;
 public Bitmap imgBaoend;
 public Bitmap imgBaobg;
 Bitmap dstbmp ;
// private Animation mAnimationTranslate;//定義平移的動畫
 //定義摔炮位置
 public int x;
 public int y;
 int initX ;
 public int initY ;
 private float scalX;
 private float scalY;
 //定義摔炮運行速度
 public int speed = 15;
 //定義線程的運行參數
 public boolean isStop = true;
 SurfaceHolder holder;
 
 Intent intent;
 Context context;
 
 public ShuaiBaoView(Context context,int x,int y) {
  super(context);
  // TODO Auto-generated constructor stub
  
  this.context = context;
  initY = y-30;//初始化摔炮y軸初始坐標
  this.x = x/2-5;;//初始化摔炮x軸坐標
  this.y = initY;//初始化摔炮Y周卓表
  scalX = x;//保存屏幕寬
  scalY = y;//保存屏幕高
  holder = getHolder();//獲取holder
  holder.addCallback(this);
  Resources res = context.getResources();
  imgBao = BitmapFactory.decodeResource(res,R.drawable.shuaibao_bao);
  imgBaoend = BitmapFactory.decodeResource(res,R.drawable.shuaipao_baoend);
  imgBaobg = BitmapFactory.decodeResource(res,R.drawable.shuaibao_bg);
  Matrix matrix=new Matrix();
  matrix.postScale(scalX/imgBaobg.getWidth(), 
    scalY/imgBaobg.getHeight());//獲取縮放比例
  dstbmp = Bitmap.createBitmap(imgBaobg,0,0,imgBaobg.getWidth(),
    imgBaobg.getHeight(),matrix,true);//按縮放比例生成適應屏幕的新的bitmap;
  intent = new Intent("com.soundmanagerbao.android.music");
  setFocusable(true);
 }
 public void onDraw(Canvas canvas){
  super.onDraw(canvas);
  //繪製圖片
  canvas = holder.lockCanvas(null);//獲取畫布
  Paint mPaint = new Paint();//獲取畫筆
  //畫自適應背景
  canvas.save();
  canvas.drawBitmap(dstbmp, 0, 0, mPaint); //畫出圖片
  canvas.restore();
  switch(state){
  case PAUSE:{//暫停
  
   canvas.save();
   canvas.drawBitmap(imgBao, x, initY,mPaint);
   canvas.restore();
  }
  break;
  case START://開始
  {
   canvas.save();
   canvas.drawBitmap(imgBao, x, y,mPaint);
   canvas.restore(); 
   y-=speed;
   if(y<=120){
    state = HIT;
   }
  }
  break;
  case HIT:{//撞擊
   canvas.save();
   canvas.drawBitmap(imgBaoend, x, 115,mPaint);
   canvas.drawBitmap(imgBaoend, x, 115,mPaint);
   canvas.restore();
   context.startService(intent);   
   state = PAUSE;
  }
  break;
  }
  holder.unlockCanvasAndPost(canvas);
 }
 class MyThread implements Runnable{//畫圖,刷新

  @Override
  public void run() {
   // TODO Auto-generated method stub
   while(isStop){
    Canvas canvas1 = null;
    onDraw(canvas1);
   }
  }
  
 }
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
  // TODO Auto-generated method stub
  
 }
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub 
  isStop = true;
  new Thread(new MyThread()).start();//開始線程
 }
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  isStop = false;//返回時關閉線程
 }
 
}


最後更新:2017-04-02 17:28:40

  上一篇:go 移動web app開發-----調試篇
  下一篇:go webview與HTML加載自適應問題解決方案(網頁拖動右邊有空白)