Android动画及图片的缩放和旋转 Android动画有2种,一种是Tween Animation,另一种是Frame Animation,先说说
Android动画及图片的缩放和旋转
Android动画有2种,一种是Tween Animation,另一种是Frame Animation,先说说Tween动画吧。
Tween动画是对视图对象中的内容进行一系列简单的转换,比如位置的移动,大小的缩放,旋转,透明度得变化等等。Tween动画可以写到一个xml文件中,就像定义布局文件一样,当然,也可以写到android代码中,不过推荐写到xml文件中,因为它具备的阅读性,可重用性大大超过了硬编码。xml文件放在工程的res/anim目录中,这个目录中要包含一个根元素,可以是<scale>,<translate>,<alpha>或者<rotate>,当然,这些元素都可以放到一个动画集合<set>中,默认情况下,所有的动画指令都是同时发生的,为了让他们按顺序发生,需要设置一个特殊的属性startOffset。下面定义了一个动画的集合:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700"/> <set android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" android:fillBefore="false"/> <rotate android:fromDegrees="0" android:toDegrees="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400"/> </set> </set>?紧跟在这个集合后面的是一个缩放动画,里面有一些个属性,下面一一介绍:android:interpolator属性:这是值定一个动画的插入器,有一些常用的插入器:accelerate_decelerate_interpolator加速-减速动画插入器,顾名思义,就是先加速后减速,accelerate_interpolator加速动画插入器,decelerate_interpolator减速动画插入器android:fromXScale属性为动画起始时,x坐标上的伸缩尺寸android:toXScal属性为动画结束时,x坐标上的伸缩尺寸android:fromYScale属性为动画起始时,y坐标上的伸缩尺寸android:toYScale属性为动画结束时,y坐标上的伸缩尺寸关于伸缩尺寸这里还要罗嗦一下:也就是上面的四个属性的值:0.0表示收缩到没有,1.0表示正常无收缩,值小于1.0表示收缩,值大于1.0表示放大。android:fillAfter属性当设置为true时,该动画转化在动画结束后被应用,同理还有android:fillBefore属性,当设置为true时,该动画转化在动画开始前被应用android:duration属性表示动画持续的时间,单为时毫秒android:pivotX属性为动画相对于x坐标的起始位置android:pivotY属性为动画相对于y坐标的起始位置这2个属性有不同的格式表示,如值为50,表示是相对于父类的50%,如值为50%,表示是相对于自己的50%这里的50%表示相对于自身x,y坐标上的中点位置紧跟着是一个动画集合,里面有缩放和旋转,这个集合的interpolater为减速动画插入器这里的缩放里面还有一个属性,android:startOffset属性是设置动画开始的时间,这里设置700是表示700毫秒之后开始,也就是第一个缩放完成之后开始。旋转里面的属性跟scale里面的都差不多,只是旋转讲究的角度。android:fromDegrees属性表示动画起始时的角度android:toDegrees属性表示动画结束时旋转的角度,可以大于360度动画文件写好了之后,我们就可以在代码中调用这个动画了,先写一个布局文件,布局文件里面有一个ImageView,然后我们让这个ImageView做动画。布局文件如下:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView1" android:src="@drawable/duola" android:layout_width="match_parent" android:layout_height="match_parent"></ImageView> </LinearLayout>?<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/register" android:duration="500"/> <item android:drawable="@drawable/duola" android:duration="500"/> <item android:drawable="@drawable/icon" android:duration="500"/> </animation-list>?<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView1" android:layout_width="match_parent" android:layout_height="match_parent"></ImageView> </LinearLayout>?package com.test.shang; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.TransitionDrawable; import android.os.Bundle; import android.view.MotionEvent; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.AnimationUtils; import android.widget.ImageView; public class TestStyle extends Activity { AnimationDrawable animationDrawable; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); ImageView iv = (ImageView) findViewById(R.id.imageView1); iv.setBackgroundResource(R.anim.anim_list); animationDrawable = (AnimationDrawable) iv.getBackground(); } @Override public boolean onTouchEvent (MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN) { animationDrawable.start(); return true; } return super.onTouchEvent(event); } }?package com.test.shang; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; public class BitmapTest extends Activity { @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("测试图片的缩放和旋转"); LinearLayout layout = new LinearLayout(this); //加载需要操作的图片,这里是机器猫的图片 Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.duola); //获取这个图片的宽和高 int width = bitmapOrg.getWidth(); int height = bitmapOrg.getHeight(); //定义预转换成的图片的宽和高 int newWidth = 200; int newHight = 200; //计算缩放率,新尺寸除原尺寸 float scaleWidth = (float)newWidth/width; float scaleHeight = (float)newHight/height; //创建操作图片用的matrix对象 Matrix matrix = new Matrix(); //缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); //旋转图片动作 matrix.postRotate(45); //创建新的图片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true); //将上面创建的Bitmap转换成Drawable对象,使得其可以使用在imageView,imageButton上。 BitmapDrawable bitmapDrawable = new BitmapDrawable(resizedBitmap); //创建一个ImageView ImageView iv = new ImageView(this); //将imageView的图片设置为上面转换的图片 iv.setImageDrawable(bitmapDrawable); //将图片居中显示 iv.setScaleType(ScaleType.CENTER); //将imageView添加到布局模板中 layout.addView(iv, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); //设置为本activity的模板 setContentView(layout); } }?好了,今天就到这里吧。。。。转自:http://www.cnblogs.com/shang53880/archive/2011/06/21/2086125.html