Android开发之图片详解(2)

来源:互联网 发布:一人之下知乎 编辑:程序博客网 时间:2024/05/02 02:44

这一篇 主要分析下不同drawable文件夹下的图片在Android手机上的加载效果。
首先在drawble-mdpi和drawble-xhdpi文件夹下分别放入同一张图片,注意是同一张图片,要起不同的名字,如图:
如图,这张图片分辨率为195*189

测试代码如下:

package com.example.imagetext;import java.util.ArrayList;import java.util.List;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.Build;import android.os.Bundle;import android.util.DisplayMetrics;import android.util.Log;import android.view.WindowManager;import android.widget.ImageView;public class MainActivity extends Activity {    private ImageView iv1,iv2;    private Bitmap bp1, bp2;    private Drawable d1,d2;    List<Drawable> list = new ArrayList<Drawable>();    List<Bitmap> listb = new ArrayList<Bitmap>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        iv1 = (ImageView) findViewById(R.id.iv1);        iv2 = (ImageView) findViewById(R.id.iv2);                   d1 = iv1.getDrawable();        d2 = iv2.getDrawable();        bp1 = ((BitmapDrawable)d1).getBitmap();        bp2 = ((BitmapDrawable)d2).getBitmap();        Log.e("tttext","频幕密度:"+getScreenDensityDpi(this));        Log.e("tttext","drawble-mdpi:"+"宽"+bp1.getWidth()+"高"+bp1.getHeight()+"占用内存:"+getBitmapsize(bp1)/1024+"KB");        Log.e("tttext","drawble-xhdpi:"+"宽"+bp2.getWidth()+"高"+bp2.getHeight()+"占用内存:"+getBitmapsize(bp2)/1024+"KB");    }    @SuppressLint("NewApi")    public long getBitmapsize(Bitmap bitmap) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {            return bitmap.getByteCount();        }        // Pre HC-MR1        return bitmap.getRowBytes() * bitmap.getHeight();    }    /**     * 获取屏幕密度系数     *      * 例:0.75 / 1.0 / 1.5 / 2 / 3     *      */    public float getScreenDensity(Context context) {        DisplayMetrics metric = new DisplayMetrics();        WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        manager.getDefaultDisplay().getMetrics(metric);        return metric.density;    }    /**     * 获取屏幕密度     *      * 例:120 / 160 / 240 / 320(280-400) / 480(400-560)     *      */    public int getScreenDensityDpi(Context context) {        DisplayMetrics metric = new DisplayMetrics();        WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        manager.getDefaultDisplay().getMetrics(metric);        return metric.densityDpi;    }    @Override    protected void onStart() {        super.onStart();    //  Log.e("tttext",  Runtime.getRuntime().totalMemory()/1024/1024+"kk"+Runtime.getRuntime().freeMemory()/1024/1024+"ff"+Runtime.getRuntime().maxMemory()/1024/1024);    }}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    ><ImageView      android:id="@+id/iv1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:src="@drawable/icon_nongye"    /><ImageView      android:layout_marginTop="10dp"    android:id="@+id/iv2"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:src="@drawable/icon_zhaoshang"    /></LinearLayout>

运行出来的效果图

然后是打印的截图
这里写图片描述

从这里就可以看出,drawble-mdpi文件夹下的图片被放大成了原来的2倍,而drawble-xhdpi文件夹下的图片分辨率不变。

在上一篇里我们讲到了各个文件夹对应的dpi分别是:
drawable-mdpi 160dpi
drawable-hdpi 240dpi
drawable-xhdpi 320dpi
drawable-xxhdpi 480dpi
drawable-xxxhdpi 640dpi

因为这个测试机频幕密度刚好是320dpi,所以在xhdpi下的图片刚好保持原样,而在mdpi下的图片则变为原来的320/160,即2倍。

同时可以看到,图片占用的内存也变成了原来的2*2=4倍;

同理,如果手机密度比较低的时候,高分辨率的图片也是会被压缩的,所以我们做图片适配的时候,完全可以从最高分辨率往下适配,也就是说在xxhdpi里放一套图就可以了,这样不仅可以减少包的整体大小,也不会在低密度的手机上出现内存占用过大的问题(因为图片被压缩过后,占用的内存也会相应地缩小)。

下一篇 将具体分析下bitmap和drawble的关系,以及iamgeview的几个设置图片的方法的区别。

0 0
原创粉丝点击