Android 5从入门到精通
上QQ阅读APP看书,第一时间看更新

4.6 Bitmap

Bitmap称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的,这些点通过不同的排列和染色以构成图样。Bitmap是Android系统中图像处理最重要的类之一,用它可以获取图像文件信息,对图像进行剪切、旋转、缩放等操作,并可以将图像保存成特定格式的文件。Bitmap位于android.graphics包中,Bitmap不提供对外的构造方法,只能通过BitmapFactory类进行实例化。利用BitmapFactory的decodeFile方法可以从特定文件中获取Bitmap对象,也可以使用decodeResource()从特定的图片资源中获取Bitmap对象。

实例BitmapDemo从资源文件中创建Bitmap对象,并对其进行一些操作,运行效果如图4.40所示。

图4.40 Bitmap对象的效果

其对应布局文件Main.xml内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
       <SeekBar
            android:id="@+id/seekBarId"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />



       <ImageView
            android:id="@+id/imageview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/im01" />



    </LinearLayout>

BitmapDemoActivity.Java代码如下:

    package introduction.android.bitmapDemo;



    import com.sie.bitmapdemo.R;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Matrix;
    import android.os.Bundle;
    import android.widget.ImageView;
    import android.widget.SeekBar;
    import android.widget.SeekBar.OnSeekBarChangeListener;
    import android.widget.TextView;



    public class BitmapDemoActivity extends Activity
    {
        ImageView myImageView;
        Bitmap myBmp, newBmp;
        int bmpWidth, bmpHeight;
        SeekBar seekbarRotate;
        float rotAngle;



        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            myImageView=(ImageView)findViewById(R.id.imageview);
            // 由Resource载入图片
            myBmp=BitmapFactory.decodeResource(getResources(), R.drawable.im01);
            bmpWidth=myBmp.getWidth();
            bmpHeight=myBmp.getHeight();
            // 实例化matrix
            Matrix matrix=new Matrix();
            //设定Matrix属性 x,y缩放比例为1.5
            matrix.postScale(1.5F, 1.5F);
            //顺时针旋转45度
            matrix.postRotate(45.0F);
            newBmp=Bitmap.createBitmap(myBmp, 0, 0, bmpWidth, bmpHeight, matrix, true);
            seekbarRotate=(SeekBar)findViewById(R.id.seekBarId);
            seekbarRotate.setOnSeekBarChangeListener(onRotate);
        }
        private SeekBar.OnSeekBarChangeListener onRotate=new SeekBar.OnSeekBarChangeListener(){



            public void onStopTrackingTouch(SeekBar seekBar)
            {
                // TODO Auto-generated method stub



            }



            public void onStartTrackingTouch(SeekBar seekBar)
            {
                // TODO Auto-generated method stub



            }



            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser)
            {
                // TODO Auto-generated method stub
                Matrix m=new Matrix();
                m.postRotate((float)progress*3.6F);
                newBmp=Bitmap.createBitmap(myBmp, 0, 0, bmpWidth, bmpHeight, m, true);
                myImageView.setImageBitmap(newBmp);
            }
        };
    }

本实例实现了拖动进度条图片旋转的效果。使用BitmapFactory从资源中载入图片,并获取图片的宽和高,之后使用Matrix类对图片进行缩放和旋转操作。