android学习笔记(九)——动画效果的实现1tween动画
2015-07-05 09:12
666 查看
android提供了两种动画的实现方式,一种是tween动画,而另一种则是onframe动画,今天先来介绍一下tween动画:
一,通过java代码来实现
android提供了一个animation类和一个animationset类,即动画类和动画集类,这个就是实现tween动画的基础,实现首先是定义一个animation类,给其赋予动画动作,之后start即可,需要注意的是需要放到view类里面实现,而不是在Activity中,动画类提供了几种基本动作,透明度变化,平移,旋转,缩放,下面就来介绍一下,这4种基本动作的实现
1.透明度变化,alphaAnimation的第一个参数是初始透明度,第二个是动画结束时的透明度,setDuration函数是用来设置动画的播放时间,即从初始透明度变化到结束时透明度的所需时间
2.平移变化,第一个参数为起始X坐标,第二个结束x坐标,第三个参数为起始y坐标,第四个结束y坐标,都是相对于左上角来看的坐标
3.缩放变化,第一个参数为初始x轴的缩放率,第二个参数为结束时x轴缩放比率,三,四参数与一二参数一致,对应Y轴,这里的缩放率可以看成从0.1倍大小放大到1倍大小
4.旋转变化,第一个参数为初始角度,第二个参数为结束时角度,都是相对于图片左上角来看的
5.组合动画,之前提过了AnimationSet类,这个类可以将多个Animation类组合到一起同时播放,实现过程如下,通过addAnimation将动画载入到动画集中,然后开始播放动画集,从而实现组合动画效果
下面是一个View类的实现代码,需要注意的是在Activity中的调用方式,一定要注意的是设置焦点为true,否则view类中的按键是没办法响应的,因为此时按键响应是在Activity上的
二,通过XML来实现动画效果
上述动画不光能用java的代码来实现,同样也可以用xml来实现,实现方式稍微有点差别,下面就来介绍一下如何使用xml来实现Tween动画效果
首先在res下创建anim的文件夹,之后再其中新建xml文件,之后就可以通过AnimationUtils的方法LoadAnimation来载入写在xml中的动作
1.透明度变化
2.缩放变化,参数和之前代码形式是一样的
3.旋转变化
4.平移变化
5,动画集,在set中添加标签rotate,translate,alpha,scale然后完善其参数即可
具体的调用方式如下:
这样TWEEN动画的实现就介绍完毕了
一,通过java代码来实现
android提供了一个animation类和一个animationset类,即动画类和动画集类,这个就是实现tween动画的基础,实现首先是定义一个animation类,给其赋予动画动作,之后start即可,需要注意的是需要放到view类里面实现,而不是在Activity中,动画类提供了几种基本动作,透明度变化,平移,旋转,缩放,下面就来介绍一下,这4种基本动作的实现
1.透明度变化,alphaAnimation的第一个参数是初始透明度,第二个是动画结束时的透明度,setDuration函数是用来设置动画的播放时间,即从初始透明度变化到结束时透明度的所需时间
alphaAnimation = new AlphaAnimation(0.1f, 1.0f); //设置动画时间 alphaAnimation.setDuration(10000); this.startAnimation(alphaAnimation);
2.平移变化,第一个参数为起始X坐标,第二个结束x坐标,第三个参数为起始y坐标,第四个结束y坐标,都是相对于左上角来看的坐标
translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f); //设置动画时间 translateAnimation.setDuration(10000); this.startAnimation(translateAnimation);
3.缩放变化,第一个参数为初始x轴的缩放率,第二个参数为结束时x轴缩放比率,三,四参数与一二参数一致,对应Y轴,这里的缩放率可以看成从0.1倍大小放大到1倍大小
scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f); flag="left"; //设置动画时间 scaleAnimation.setDuration(10000); this.startAnimation(scaleAnimation);
4.旋转变化,第一个参数为初始角度,第二个参数为结束时角度,都是相对于图片左上角来看的
rotateAnimation = new RotateAnimation(0f, 360f); flag="down"; rotateAnimation.setDuration(10000); this.startAnimation(rotateAnimation);
5.组合动画,之前提过了AnimationSet类,这个类可以将多个Animation类组合到一起同时播放,实现过程如下,通过addAnimation将动画载入到动画集中,然后开始播放动画集,从而实现组合动画效果
translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f); //初始化 Alpha动画 alphaAnimation = new AlphaAnimation(0.1f, 1.0f); //动画集 AnimationSet set = new AnimationSet(true); set.addAnimation(translateAnimation); set.addAnimation(alphaAnimation);
下面是一个View类的实现代码,需要注意的是在Activity中的调用方式,一定要注意的是设置焦点为true,否则view类中的按键是没办法响应的,因为此时按键响应是在Activity上的
myView view=new myView(this); view.setFocusable(true); setContentView(view);
package com.example.netdemo; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget.Toast; public class Get extends Activity { private static final String tag="paint"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView view=new myView(this); view.setFocusable(true); setContentView(view); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.get, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public class myView extends View{ private String flag=""; public myView(Context context) { super(context); // TODO Auto-generated constructor stub } public void onDraw(Canvas canva){ Paint mPaint=new Paint(); //设置paint为无锯齿 mPaint.setAntiAlias(true); //设置paint颜色 mPaint.setColor(Color.RED); mPaint.setTextSize(14); //设置空心外框的宽度 mPaint.setStrokeWidth(5); Log.i(tag,"paint的颜色: "+mPaint.getColor()); Log.i(tag,"paint的Alpha: "+mPaint.getAlpha()); Log.i(tag,"paint的外框宽度: "+mPaint.getStrokeWidth()); Log.i(tag,"paint的字体尺寸: "+mPaint.getTextSize()); /*//绘制一个矩形 canva.drawRect((320-80)/2,20,(320-80)/2+80,20+40,mPaint); //设置风格为实心 mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.GREEN); //绘制绿色实心矩形 canva.drawRect(0,20,40,20+40,mPaint); //画图像 Bitmap mbitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.pic1)).getBitmap(); Log.i(tag,"图像的宽度: "+mbitmap.getWidth()); Log.i(tag,"图像的宽度: "+mbitmap.getHeight()); Log.i(tag,"mutable属性: "+mbitmap.isMutable()); int h=mbitmap.getHeight(); int w=mbitmap.getWidth(); //获取配置信息 try{ mbitmap.setHeight(h/4); mbitmap.setWidth(w/4); Log.i(tag,"图像的宽度: "+mbitmap.getWidth()); Log.i(tag,"图像的宽度: "+mbitmap.getHeight()); }catch(Exception e){ Log.i(tag,"错误为: "+e.getMessage()); }*/ //将mutable属性化为true,让图片可变 Bitmap mbitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.pic1)).getBitmap(); Log.i(tag,"图像的宽度: "+mbitmap.getWidth()); Log.i(tag,"图像的宽度: "+mbitmap.getHeight()); Log.i(tag,"mutable属性: "+mbitmap.isMutable()); int h=mbitmap.getHeight(); int w=mbitmap.getWidth(); Bitmap mbitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.pic1).copy(Bitmap.Config.ARGB_8888, true); Log.i(tag,"mutable属性: "+mbitmap1.isMutable()); try{ mbitmap1.setHeight(h/4); mbitmap1.setWidth(w/4); Log.i(tag,"图像的宽度: "+mbitmap1.getWidth()); Log.i(tag,"图像的宽度: "+mbitmap1.getHeight()); }catch(Exception e){ Log.i(tag,"错误为: "+e.getMessage()); } //matrix缩放 Matrix mMatrix=new Matrix(); mMatrix.reset(); mMatrix.setScale(0.2f,0.2f); Bitmap mbitmap2=Bitmap.createBitmap(mbitmap,0,0,w,h,mMatrix,true); canva.drawBitmap(mbitmap2,40, 50,null); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub Log.i(tag,"on key down"); return true; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { // TODO Auto-generated method stub //透明度渐变 Animation alphaAnimation=null; //旋转动画 Animation rotateAnimation=null; //缩放动画 Animation scaleAnimation=null; //位置移动 Animation translateAnimation=null; Log.i("Tween", "onKeyDown"); switch(keyCode){ case KeyEvent.KEYCODE_DPAD_UP: Log.i("Tween", "onKeyDown - KEYCODE_DPAD_UP"); flag="up"; alphaAnimation = new AlphaAnimation(0.1f, 1.0f); //设置动画时间 alphaAnimation.setDuration(10000); this.startAnimation(alphaAnimation); break; case KeyEvent.KEYCODE_DPAD_DOWN: Log.i("Tween", "onKeyDown - KEYCODE_DPAD_DOWN"); rotateAnimation = new RotateAnimation(0f, 360f); flag="down"; rotateAnimation.setDuration(10000); this.startAnimation(rotateAnimation); break; case KeyEvent.KEYCODE_DPAD_LEFT: Log.i("Tween", "onKeyDown - KEYCODE_DPAD_LEFT"); //初始化 scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f); flag="left"; //设置动画时间 scaleAnimation.setDuration(10000); this.startAnimation(scaleAnimation); break; case KeyEvent.KEYCODE_DPAD_RIGHT: Log.i("Tween", "onKeyDown - KEYCODE_DPAD_RIGHT"); flag="right"; //初始化 translateAnimation = new TranslateAnimation(20.0f, 100.0f,20.0f,100.0f); //设置动画时间 translateAnimation.setDuration(10000); this.startAnimation(translateAnimation); break; case KeyEvent.KEYCODE_DPAD_CENTER: flag="center"; Log.i("Tween", "onKeyDown - KEYCODE_DPAD_CENTER"); //初始化 Translate动画 translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f); //初始化 Alpha动画 alphaAnimation = new AlphaAnimation(0.1f, 1.0f); //动画集 AnimationSet set = new AnimationSet(true); set.addAnimation(translateAnimation); set.addAnimation(alphaAnimation); //设置动画时间 (作用到每个动画) set.setDuration(10000); this.startAnimation(set); break; default: break; } return true; } @Override protected void onAnimationEnd() { // TODO Auto-generated method stub if(flag=="up"){ Toast.makeText(this.getContext(), flag+"动画完结", Toast.LENGTH_LONG).show(); }else if(flag=="down"){ Toast.makeText(this.getContext(), flag+"动画完结", Toast.LENGTH_LONG).show(); }else if(flag=="left"){ Toast.makeText(this.getContext(), flag+"动画完结", Toast.LENGTH_LONG).show(); }else if(flag=="right"){ Toast.makeText(this.getContext(), flag+"动画完结", Toast.LENGTH_LONG).show(); }else if(flag=="center"){ Toast.makeText(this.getContext(), flag+"动画完结", Toast.LENGTH_LONG).show(); } super.onAnimationEnd(); } @Override protected void onAnimationStart() { // TODO Auto-generated method stub if(flag=="up"){ Toast.makeText(this.getContext(), flag+"动画开始", Toast.LENGTH_LONG).show(); }else if(flag=="down"){ Toast.makeText(this.getContext(), flag+"动画开始", Toast.LENGTH_LONG).show(); }else if(flag=="left"){ Toast.makeText(this.getContext(), flag+"动画开始", Toast.LENGTH_LONG).show(); }else if(flag=="right"){ Toast.makeText(this.getContext(), flag+"动画开始", Toast.LENGTH_LONG).show(); }else if(flag=="center"){ Toast.makeText(this.getContext(), flag+"动画开始", Toast.LENGTH_LONG).show(); } super.onAnimationStart(); } } }
二,通过XML来实现动画效果
上述动画不光能用java的代码来实现,同样也可以用xml来实现,实现方式稍微有点差别,下面就来介绍一下如何使用xml来实现Tween动画效果
首先在res下创建anim的文件夹,之后再其中新建xml文件,之后就可以通过AnimationUtils的方法LoadAnimation来载入写在xml中的动作
1.透明度变化
<?xml version="1.0" e c86d ncoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha <!--fromAlpha就是初始透明度,toalpha为结束时透明度,duration就是动画播放时间> android:fromAlpha="0.1" android:toAlpha="1.0" android:duration="2000" /> </set>
2.缩放变化,参数和之前代码形式是一样的
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.1" android:toXScale="1.0" android:fromYScale="0.1" android:toYScale="1.0" android:duration="10000" /> </set>
3.旋转变化
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:fromDegrees="0" android:toDegrees="360" android:duration="500" /> </set>
4.平移变化
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="1.0" android:toXDelta="100.0" android:fromYDelta="1.0" android:toYDelta="100.0" android:duration="10000"> </translate> </set>
5,动画集,在set中添加标签rotate,translate,alpha,scale然后完善其参数即可
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="1.0" android:toXDelta="100.0" android:fromYDelta="1.0" android:toYDelta="100.0" android:duration="10000"> </translate> <alpha android:fromAlpha="0.1" android:toAlpha="1.0" android:duration="2000" /> </set>
具体的调用方式如下:
//普通单体调用 alphaAnimation=AnimationUtils.loadAnimation(this.getContext(),R.anim.action_alpha); this.startAnimation(alphaAnimation); //动画集调用,返回对象是animation对象需要强制转换为动画集对象 AnimationSet set = (AnimationSet) AnimationUtils.loadAnimation(this.getContext(),R.anim.action_set); this.startAnimation(set);
这样TWEEN动画的实现就介绍完毕了
相关文章推荐
- Android 修改host文件的3种方法
- Xamarin.Android开发实践(九)
- Xamarin.Android开发实践(八)
- android4.0 USB Camera示例(五个辅助)jpg压缩
- Android截图
- Android studio中导入开源库出现com.android.ide.common.process.ProcessException 错误
- android依赖注入框架Dagger和Butterknife实战
- Android中万能的适配器的详细讲解(附源代码)
- android开发之一如何升级SDK
- 【Android】ImageView的src和background的区别以及两者的妙用
- 史上最详细的Android Studio系列教程三--快捷键
- 史上最详细的Android Studio系列教程四--Gradle基础
- android开发之GestureDetector手势识别(调节音量、亮度、快进和后退)
- Activity内部Handler引起内存泄露的原因分析
- Android TimeLine 类时间戳,时间轴控件。
- android 布局中 gravity 和 layout_gravity 属性
- Android下的Junit单元测试
- Android5.1 - 通讯录建立群组
- android PopupWindow 自适应宽度
- android 通过获得dimens.xml中定义的大小来设置字体的大小