android:动态缩放和旋转图像

我是android新手,写博客是为了做好学习笔记,以便以后能经常复习。另外,还想能过这个方式和大家交流学习,希望大家能够指正我的错误,帮助我提高能力,丰富知识。

缩放图像的方法有很多种,最简单的依法就是改变ImageView组件的大小。但应将<ImageView>标签的android:scaleType属性值设为fitCenter。旋转图像可以用android.graphics.Matris类的setRotate方法来实现,通过该方法可以指定旋转的任度数。

这里用了两个拖动条(SeekBar),第一个SeekBar用于缩放图像(android:max属性值为240),第2个SeekBar用于旋转图像(android:max属性值为360,也就是说,通过该SeekBar可以使图像最多旋转360度)。

布局文件代码如下:main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_horizontal"
    >
<TextView  
	android:layout_gravity="center_horizontal"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<ImageView
	android:id="@+id/one"
	android:layout_width="150dp"
	android:layout_height="160dp"
	android:src="@drawable/b"
	android:scaleType="fitCenter"
	/>
<TextView
	android:id="@+id/tv1"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text="图像宽度:149  图像高度:159" />
<SeekBar 
	android:progress="120" 
	android:id="@+id/s1"
	android:layout_height="wrap_content" 
	android:max="240" 
	android:layout_width="fill_parent" 
	android:layout_marginTop="20dp">
</SeekBar>
<TextView
	android:id="@+id/tv2"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text="0度" />
<SeekBar
	android:id="@+id/s2"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:layout_marginTop="20dp"
	android:max="360"  />
</LinearLayout>
Activity代码:csf.java
package csf.imamgeview;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class csf extends Activity implements OnSeekBarChangeListener{
	private int  m= 29,n=39;//图像的最小宽度和高度。
	private ImageView one;
	private TextView tv1, tv2;
	private Matrix matrix = new Matrix();
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        one=(ImageView)findViewById(R.id.one);
        tv1=(TextView)findViewById(R.id.tv1);
        tv2=(TextView)findViewById(R.id.tv2);
        SeekBar s1=(SeekBar)findViewById(R.id.s1);
        SeekBar s2=(SeekBar)findViewById(R.id.s2);
        s1.setOnSeekBarChangeListener(this);
        s2.setOnSeekBarChangeListener(this);
        
        //为了自适应屏幕的宽度,使图你放大到与屏幕宽度相等时为止,使用如下代码来获得屏幕的宽度,并将屏幕宽度与图像的最小宽度的差作为android:max属性        //的值
        DisplayMetrics dm = new DisplayMetrics();
	getWindowManager().getDefaultDisplay().getMetrics(dm);
	s1.setMax(dm.widthPixels - m);
    }

	@Override

        //在SeekBar类的onProgressChanged事件方法中需要控制图像的缩放和旋转
	public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) 
                {

                //处理图像缩放

		if(seekBar.getId()==R.id.s1)
		{
			int newwidth=progress+m;//计算处缩放后图像的新宽度

			int newheigth=(int)progress*159/149+n;//计算处缩放后图像的新高度
                        //设置ImageView的大小

			one.setLayoutParams(new LinearLayout.LayoutParams(newwidth,newheigth));

			tv1.setText("图像宽度:"+newwidth+"   图像高度:"+newheigth);
		}

                //处理图像旋转

		if(seekBar.getId()==R.id.s2)
		{
                        //装载R.drawable.b图像文件,并返回Bitmap对像
			Bitmap bitmap=((BitmapDrawable) getResources().getDrawable(R.drawable.b)).getBitmap();

                        //设置图像的旋转角度
			matrix.setRotate(progress);

                        //旋转图像,并生成新的Bitmap对像
			bitmap=Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

                        //重新在ImageView组件中显示旋转后的图像
			one.setImageBitmap(bitmap);
			tv2.setText(progress+"度");
		}
	}

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值