1、Drawable对象

  Android应用添加了Drawabe资源之后,Android SDK会为这份资源文件在R清单文件中创建一个索引项:R.drawable.file_name,接着我们可以在xml资源文件中通过@drawable/file_name来访问该drawable对象,也可以在java代码中通过R.drawable.file_name来访问该drawable对象,在java代码中R.drawable.file_name只是一个int类型的常量,它只代表了drawable对象的一个id,如果要获取实际的drawable对象,则需要调用Resources的getDrawable(int id)方法来获取。

2、Bitmap与BitmapFactory

    (1)Bitmap代表一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象,开发者为了把一个Bitmap对象封装成BitmapDrawable对象,可以调用BitmapDrawable的构造器:      把一个Bitmap对象包装成BitmapDrawable对象      BitmapDrawable drawable = new BitmapDrawable(bitmap);    (2)如果需要获取BitmapDrawable所包装的Bitmap对象,可以调用BitmapDrawable的getBitmap()方法:        获取BitmapDrawable对象所包装的Bitmap对象        Bitmap bitmap = drawable.getBitmap();   (3)Bitmap提供了一些静态方法来创建新的Bitmap对象:         Bitmap.createBitmap(source, x, y, width,height):从源位图source的指定坐标点x,y开始,从中挖取宽width、高height的一块区域,创建新的Bitmap      Bitmap.createScaledBitmap(src, dstWidth, dstHeight,filter):对源位图src进行缩放,缩成宽dstWidth、高DSTHeight的新位图         Bitmap.createBitmap(width,height, config):创建一个宽width、高height的新位图         Bitmap.createBitmap(source, x, y,width, height, m,filter):从源位图source的指定坐标点x,y开始,从中挖取宽width、高height的一块区域,创建新的Bitmap          ,并按照Matrix指定的规则进行变换  (4)BitmapFactory是一个工具类,他提供了一些方法用于从不同的数据源来解析、创建Bitmap对象:       BitmapFactory.decodeByteArray(byte[] data, int offset, int length):从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象      BitmapFactory.decodeFile(String pathName):从pathName指定的文件中解析、创建Bitmap对象      BitmapFactory.decodeFileDescriptor(FileDescriptor fd):用于从FileDescriptor对应的文件中解析、创建Bitmap对象      BitmapFactory.decodeResource(Resources res, int id):用于根据给定的资源ID从指定资源文件中解析、创建Bitmap对象         BitmapFactory.decodeStream(InputStream is):用于从指定输入流中解析、创建Bitmap对象  (5)Android为Bitmap提供了两个方法来判断它是否已经回收,以及强制Bitmap回收自己      isRecycled():判断Bitmap对象是否已经回收       recycle():强制一个Bitmap对象立即回收自己

3、实例:图片查看器,查询assets目录下的图片

布局文件:

<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"    android:gravity="center" >    <ImageView        android:id="@+id/imageview"        android:layout_width="300dp"        android:layout_height="300dp" />    <Button        android:id="@+id/btn"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="搜索下一个" /></LinearLayout>

activity文件:

package com.example.image;import java.io.IOException;import java.io.InputStream;import android.app.Activity;import android.content.res.AssetManager;import android.graphics.BitmapFactory;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;/** * Bitmap和BitmapFactory * @author yinbenyang */public class MainActivity extends Activity {    private ImageView imageview;    String[] images = null;    private Button btn;    // 用于管理assets文件夹下的资源    AssetManager assets = null;    // 当前图片    int currentImg = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        imageview = (ImageView) findViewById(R.id.imageview);        btn = (Button) findViewById(R.id.btn);        assets = getAssets();        try {            // 获取/assets目录下的所有文件            images = assets.list("");        } catch (IOException e) {            e.printStackTrace();        }        // 点击按钮查看下一张图片        btn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                //如果图片是最后一个了,就置为第一个                if (currentImg >= images.length) {                    currentImg = 0;                }                //找到下一个图片文件                while (!images[currentImg].endsWith(".png")                        && !images[currentImg].endsWith(".jpg")                        && !images[currentImg].endsWith(".gif")) {                    currentImg++;                    if (currentImg >= images.length) {                        currentImg = 0;                    }                }                InputStream assetFile = null;                try {                    //打开指定资源对应的输入流                    assetFile = assets.open(images[currentImg++]);                } catch (IOException e) {                    e.printStackTrace();                }                BitmapDrawable bitDrawable = (BitmapDrawable)imageview.getDrawable();                //如果图片没有回收,先强制回收该图片                if(bitDrawable != null && !bitDrawable.getBitmap().isRecycled()){                    bitDrawable.getBitmap().recycle();                }                //改变ImageView显示的图片                imageview.setImageBitmap(BitmapFactory.decodeStream(assetFile));            }        });    }}

实例效果如下:点击搜索下一个,轮换显示图片

更多相关文章

  1. Android之Handler有感(二)
  2. Android-webview教程一
  3. Android之JavaSe基础--面向对象高级部分-接口,抽象类(五)
  4. Android(安卓)PMS(一)-启动流程
  5. Android中SimpleAdapter,ArrayAdapter和BaseAdapter
  6. Android程序中如何排查和解决异常
  7. OpenCore框架概述(二)
  8. android-客户端打包
  9. 【Android(安卓)Developers Training】 11. 支持不同语言

随机推荐

  1. ubuntu 配置Android(安卓)开发环境
  2. Arcgis android 10.2安装方法
  3. Android使用ActivityGroup设置android:wi
  4. android控件布局
  5. 2.3.1TextView控件
  6. android 中的url操作
  7. ADT在线安装(http://dl-ssl.google.com/an
  8. Android学习整理 - 系列
  9. Android学习笔记(二三): 多页显示-Flipper的
  10. Android中webview跟JAVASCRIPT中的交互