Android开发之图片详解(2)

这一篇 主要分析下不同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的几个设置图片的方法的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值