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;//返回时关闭线程
 }
 
}


相关文章
|
2月前
Discuz! X3.5插件云诺-阿里云短信手机登录 会员登录后也无法查看附件图片的问题解决方法
Discuz! X3.5插件云诺-阿里云短信手机登录 会员登录后也无法查看附件图片的问题解决方法
38 2
|
3月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
71 20
Android经典面试题之图片Bitmap怎么做优化
|
2月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
22 1
|
2月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
809 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
4月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
4月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
263 4
|
4月前
|
XML 前端开发 Android开发
Android经典实战之Kotlin中实现圆角图片和圆形图片
本文介绍两种实现圆角图像视图的方法。第一种是通过自定义Kotlin `AppCompatImageView`,重写`onDraw`方法使用`Canvas`和`Path`进行圆角剪裁。第二种利用Android Material库中的`ShapeableImageView`,简单配置即可实现圆角效果。两种方法均易于实现且提供动态调整圆角半径的功能。
85 0
|
5月前
|
前端开发 小程序
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
420 0
|
6月前
|
JSON 编解码 Apache
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
66 1
|
6月前
|
开发工具
云控微信开发SDK使用教程--手机微信朋友圈图片上传服务端
云控微信开发SDK使用教程--手机微信朋友圈图片上传服务端