如何使用ImageView做旋轉、放大、透明度

如果想要讓你的圖片能夠自由的放大, 旋轉或者改變透明度,
應該怎麼做?




首先設定好將所需的元件排好
<?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" >
    <ImageView
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/imageView"
        />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
    android:text="Set Alpha"
        />
    <SeekBar
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/alpha"
        />
    <TextView
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Set Scale"
        />
    <SeekBar
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/scale" 
    /> 
    <TextView
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Set Rotation"
        />     
    <SeekBar
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/rotation" 
        />        
</LinearLayout>

接著在初始化這些元件
    public void setComponent(){
        alpha = (SeekBar)findViewById(R.id.alpha);
        rotation = (SeekBar)findViewById(R.id.rotation);
        scale = (SeekBar)findViewById(R.id.scale);
        imageView = (ImageView)findViewById(R.id.imageView);
        alpha.setProgress(100);
    }

然後為這些元件設定事件,
public void setEventListener(){
    alpha.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
        @Override
        public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) {
        }
        @Override
        public void onStartTrackingTouch(SeekBar arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onStopTrackingTouch(SeekBar arg0) {
            // TODO Auto-generated method stub
        }
            
    });
    scale.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub                
        }
    });
    rotation.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub                
        }
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub                
        } 
    });
}
由於SeekBar必須覆寫三個方法, 但是其實我們只有用到第一個方法,
就是當按下去滑動的時候,
而第二個方法跟第三個方法是按下去的瞬間跟放開的瞬間才會觸發。

然後我們首先寫入當要滑動透明度的時候的方法,
    public void setAlpha(int alpha){
        imageView.setAlpha(alpha*2);
    }
你沒看錯, 只有一行而已, 為什麼要乘以2, 我怕圖片太透明會看不到,
你也可以只乘以alpha就好了。

再來寫入變化大小的方法,
public void setScale(int scale){
    defaultScale = scale - defaultScale;
    float sizeWidth = (1+(float)defaultScale/100);
    float sizeHeight = (1+(float)defaultScale/100);
        
    defaultScale = scale; 
    matrix.postScale(sizeWidth, sizeHeight);
        
    Bitmap bmp = Bitmap.createBitmap(bitmap, 
                       0, 0, oriBitmapWidth ,oriBitmapHeight , matrix, true);
    imageView.setImageBitmap(bmp);
}
利用Matrix物件, 可以控制圖片的放大縮小跟旋轉。

這邊說明一下, 一開始預設的大小值是0, 只要出現比目前大的大小,
我就用目前的大小扣掉預設的大小, 如果是負的表示使用者是想縮小,
如果是正的表示使用者想放大, 而由於我們的範圍是0~100,
但是我們的scale傳進來的數字也是0~100,
但是設定大小的參數卻是以倍數來計算, 因此我們除以100, 就可以把範圍落在0~2之間,
代表著假設1 就是保持原本的大小, 但是如果大於1 就是放大 ,
小於1 就是縮小。

最後剩下旋轉的方法,
public void setRotation(int angle){
    if(angle>defaultAngle){
        matrix.postRotate(defaultAngle+angle*3.6f);
    }
    else{
        matrix.postRotate(defaultAngle-angle*3.6f);
    }
    defaultAngle = angle*3.6f;
    Bitmap bmp = Bitmap.createBitmap(bitmap, 
                  0, 0, oriBitmapWidth ,oriBitmapHeight , matrix, true);
    imageView.setImageBitmap(bmp);
}
預設的角度是0度, 當旋轉角度比預設角度大表示使用者想向右旋轉, 反之就是想向左旋轉。


程式碼
http://uploadingit.com/file/28etjqdvswdaasb8/ImageViewDemo.zip