android学习笔记(九)——动画效果的实现1tween动画
来源:互联网 发布:任子行网络监测接入器 编辑:程序博客网 时间:2024/06/07 00:55
android提供了两种动画的实现方式,一种是tween动画,而另一种则是onframe动画,今天先来介绍一下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" encoding="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学习笔记(九)——动画效果的实现1tween动画
- android学习笔记(九)——动画效果的实现逐帧动画
- Android动画学习(五)之属性动画实现Tween的效果和高级属性示例
- android Tween Animations(动画效果-代码实现)的使用
- Android学习笔记14:Tween Animation动画的实现
- Android基础笔记——动画(补间动画:Tween xml实现)
- android tween 动画效果
- Android动画学习——Tween Animation
- Android学习——Tween动画
- android 动画实现(一)Tween动画
- Android Animation Tween动画效果的使用
- Android Animation Tween动画效果的使用
- Android动画效果Animation之Tween实现简单动画
- Android动画Animation之Tween用代码实现动画效果
- Android动画效果Animation之Tween实现简单动画
- android基础笔记——补间动画(Tween)代码实现
- 每日一学(九)Android动画---Tween动画的代码实现
- Android动画处理——Tween动画
- 腾讯、百度、阿里深圳建大厦 三巨头玩地产谁最强?
- 九的余数
- Circular microphone array 1
- Topshelf 和 Katana:统一的 Web 和服务体系结构
- 队列的顺序存储
- android学习笔记(九)——动画效果的实现1tween动画
- 面向对象设计的基本原则
- Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介
- 优化工作效率
- Quartz.NET - Quartz.NET Quick Start Guide
- Django的学习心得
- 一步一步进入保护模式
- 大数阶乘
- JIRA 配置