学习内容:

1.了解Drawable类的作用

2.如何使用Drawable...

3.了解Tween动画...

4.如何创建和使用Tween动画...

1.Drawable类...

  Drawable类是对图像的一种抽象...我们可以通过getDrawable方法将图片绘制在屏幕上...Drawable类下有很多种类型...在这里我只对Bitmap和Bitmapfactory进行简单的介绍...通过一个例子来简单的介绍一下...这个例子的实现功能就是可以把我们手机内部的图像设置为当前壁纸,并且我们还可以对图片来进行预览...

  我们在布局文件内部放入五个Button和一个ImageView。。。。触发按钮会完成一些相应的操作...这里就不进行粘贴了,没什么必要...重点是在MainActivity中需要注意一些细节...

package com.example.maindrawable;

import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView; public class MainActivity extends Activity implements View.OnClickListener { private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.but_1).setOnClickListener(this);
findViewById(R.id.but_2).setOnClickListener(this);
findViewById(R.id.but_3).setOnClickListener(this);
findViewById(R.id.but_4).setOnClickListener(this);
findViewById(R.id.but_5).setOnClickListener(this);
iv=(ImageView)findViewById(R.id.ImageView_1);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.but_1:
//这里是获取SD卡里的图片信息...然后对其中的图片进行相应的操作...
iv.setBackgroundDrawable(Drawable.createFromPath("/mnt/sdcard/LOST.DIR/coffee.jpg"));
break;
case R.id.but_2:
iv.setBackgroundDrawable(Drawable.createFromPath("/mnt/sdcard/LOST.DIR/java.jpg"));
break;
case R.id.but_3:
try {
//设置coffee.jpg为桌面壁纸...不过这里会报异常,因此我们需要进行捕获..
setWallpaper(BitmapFactory.decodeFile("/mnt/sdcard/LOST.DIR/coffee.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case R.id.but_4:
try {
setWallpaper(BitmapFactory.decodeFile("/mnt/sdcard/LOST.DIR/java.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case R.id.but_5:
try {
//恢复为默认壁纸...
clearWallpaper();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
} }

不过上面方法的使用时需要获取android.permission.SET_WALLPAPER权限的...设置壁纸的权限...因此我们需要在Androidmanifest.xml文件中进行相应的配置...

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.maindrawable"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" > </uses-sdk>
<uses-permission
android:name="android.permission.SET_WALLPAPER"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.maindrawable.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

我也就是简单的学习了一下Drawable类,在这里简单的介绍一下...

2.Tween动画...

  说到动画,想必我们都不陌生,Android中有两种动画,一种就是Tween动画,Tween动画被称之为补间动画,也可以被叫做渐变动画,Tween的特点就是我们只需要定义一个动画的开头和结尾的效果,其中的过程我们使用程序来完成...因此被称为补间动画,就是中间过程我们没有必要进行考虑...交给程序来完成,相比于帧动画来说,这种动画引用的资源更少,而且使用起来也更加的方便...

  Frame(帧动画)就是我们把很多张图片都覆盖在同一个屏幕上,然后对这些图片进行一帧一帧的播放,形成一种动态的效果...给人的感觉就像是一个动画在进行播放...由于人眼能分辨的帧数为24帧...因此只要帧数更大,那么也就形成了一种动态效果...因此这就是帧动画的本质,使用更高的帧速来完成图片的播放...从而形成一种动态的效果...这种动画引入的资源更多...因为是多张图片进行播放,因此需要引入更多的图片....学过Flash的会很容易理解这东西的本质....

  Tween动画的创建与使用...

Tween动画的创建需要使用到Animation类,这个类可以使控件完成一些效果,比如说旋转,移动,透明度,缩放等效果...创建Tween的三个步骤...

Animation scaleAnimation=new ScaleAnimation(0.1f,1.0f,0.1f,1.0f);//初始化操作...
scaleAnimation.setDuration(3000);//设置动画的执行时间...
iv.startAnimation(scaleAnimation);//开始动画...

一个简单动画的建立...实现一个图片的缩放效果...布局文件里就一个ImageView控件...没什么其他东西...

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <ImageView
android:id="@+id/imageview_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/psb"/> </LinearLayout>

然后就是在MainActivity里来完成初始化,设置动画的持续时间,以及启动动画的一些相应操作....

package com.example.exam7_2;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;
public class MainActivity extends Activity implements View.OnClickListener { ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=(ImageView) findViewById(R.id.imageview_1);
findViewById(R.id.imageview_1).setOnClickListener(this);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Animation scaleAnimation=new ScaleAnimation(0.1f,1.0f,0.1f,1.0f);
scaleAnimation.setDuration(3000);
iv.startAnimation(scaleAnimation);
} }

  这样就创建了一个简单的图片缩放动画...我们还可以创建更加复杂的动画,就是使用一个AnimationSet类来定义一个动画集合,然后把我们想要定义的动画全部都放入到这个集合当中去..这样就会使得一个控件完成多种动画的实现效果...这里就不完全进行粘贴了,只需要把onClick里面的代码替换成下面的代码就可以了...

ScaleAnimation(fromX,toX,fromY,toY)动画缩放效果... TranslateAnimation(fromX,toX,fromY,toY)平移效果...RotateAnimation(fromDegrees, toDegrees)旋转效果...AlphaAnimation(fromAlpha, toAlpha)透明度效果...

AnimationSet set=new AnimationSet(true);
Animation tran=new TranslateAnimation(0.1f, 1.0f, 0.1f, 1.0f);
Animation scale=new ScaleAnimation(0.1f, 1.0f, 0.1f, 1.0f);
Animation rotate=new RotateAnimation(0f, 360f);
Animation alpha=new AlphaAnimation(0.1f, 1.0f);
set.addAnimation(tran);
set.addAnimation(scale);
set.addAnimation(rotate);
set.addAnimation(alpha);
set.setDuration(3000);
iv.startAnimation(set);

这里将四种动画的方式放入到一个集合中,使一个控件去显示这四种效果,而不是四个控件分别显示一种效果...这里设置的相关参数我会在下面进行讲解...这里只是在主函数内部进行配置相应的效果...其实还有另外一种方式来显示动画的效果...就是配置一个xml文件,在xml文件内部来配置相应的效果展示,然后在主函数中进行调用...这种方式是更加合理的,也推荐使用这种方式...可以实现动画效果的复用性,也方便管理...

xml文件里的配置元素...

可配置元素 描述
<set> 根节点,定义全部的动画元素
<alpha> 定义渐变动画效果
<scale> 定义缩放动画效果
<rotate> 定义旋转动画效果
<translate> 定义平移动画效果

有了配置元素,那么必然少不了配置属性....介绍一下公共的配置属性...

可配置属性 数据类型 描述
android:duration long 定义动画的持续时间,以毫秒为单位
android:fillAfter boolean 设置为true表示该动画转化在动画结束之后被应用
android:fillBefore boolean 当设置为true时,该动画的转化在动画开始之前被应用
android:interpolator String 动画插入器(内部有一些属性来完成一些效果)
android:repeatCount int 动画重复的次数
android:repeatMode String 动画重复的模式
android:startOffset long 动画之间的间隔
android:zAdjustment int 动画在zOrder下配置
android:interpolator String 指定动画的执行速率

       简单的介绍一下动画插入器的一些属性,这些属性可以完成一些特效的生成...Interpolator对象的配置属性...

可配置属性 描述
@android:anim/accelerate_decelerate_interpolator 先加速再减速
@android:anim/accelerate_interpolator 加速
@android:anim/anticipate_interpolator 先回退一小步然后加速前进
@android:anim/anticipate_overshoot_interpolator 在上一基础上超过终点一点再到终点
@android:anim/bounce_interpolator 最后阶段弹球效果
@android:anim/cycle_interpolator 周期运动
@android:anim/decelerate_interpolator 减速
@android:anim/linear_interpolator 匀速
@android:anim/overshoot_interpolator 快速到达终点并超过终点一点最后到终点

       这就是一些相应的属性,我也并没有完全的都试一遍,有兴趣的可以试一试...来一个小例子...

<!--这个文件需要定义在res/anim文件夹下面,我们需要新建一个anim文件夹,这个文件夹本身是并没有的,然后在这个文件夹下建立一个这样的xml配置文件...-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="0.1"   //这个就是scaleAnimation的第一个参数fromX..组件从X轴缩小到0.1倍开始放大...
android:toXScale="1.0"   //这是toX,放大为图片正常大小..
android:fromYScale="0.1"   //这个就fromY,从Y轴缩小一倍开始放大..
android:toYScale="1.0"    //放大为原本大小...
android:duration="3000"/>  //动画的持续时间为3秒...
</set>

然后我们需要在MainActivity中进行调用...调用anim下配置文件的动画效果....

package com.example.exam7_2;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;
public class MainActivity extends Activity implements View.OnClickListener { ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=(ImageView) findViewById(R.id.imageview_1);
findViewById(R.id.imageview_1).setOnClickListener(this);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Animation anim=AnimationUtils.loadAnimation(MainActivity.this, R.anim.scale);//表示当前主程序调用anim下的动画配置文件...
iv.startAnimation(anim);
} }

这样就算是彻底的完成了一个补间动画的建立和应用...

  帧动画的创建与应用....

  这动画的创建上和Tween有一些不同,不过本质上的东西是一样的,仍然是在xml文件里进行文件配置,然后在主函数中进行调用...帧动画使用的是start()和stop()方法来完成动画的播放与停止,而不是采用载入的形式,设置执行时间...它有特定的函数使动画被开始和终止...

  既然是帧动画,那么必然要引入多张图片...需要在res/anim文件夹下配置一个xml文件...例如frame.xml...我就放入了一张...这里的配置文件的根节点就变成了<animation-list>子元素就是<item>,这点在配置文件上还是和Tween动画有很大的不同的...

<?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/a.jpg"
android:duration="200"/>
</animation-list>

  布局文件内部定义两个按钮,一个ImageView就行了...

在MainActivity中我们需要修改一些东西...帧动画是通过获取配置文件,然后通过start()方法启动就可以了...

package com.example.exam7_2;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.graphics.drawable.AnimationDrawable;
import android.view.animation.Animation;
import android.widget.ImageView;
public class MainActivity extends Activity implements View.OnClickListener { private ImageView iv;
private AnimationDrawable draw=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=(ImageView) findViewById(R.id.imageview_1);
findViewById(R.id.imageview_1).setOnClickListener(this);
findViewById(R.id.start).setOnClickListener(this);
findViewById(R.id.stop).setOnClickListener(this);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.start:
  this.iv.setBackgroundResource(R.anim.frame);//设置动画的资源位置...
  this.draw=(AnimationDrawable)iv.getBackground();//取得背景的Drawable对象...
  this.draw.setOneShot(false);//设置执行次数
  this.draw.start();//开始动画...
case R.id.stop:
  this.draw.stop();//停止动画...
}
} }

  这就是帧动画的创建于应用,给我的感觉能使用Tween动画就尽量少使用Frame动画,相比来说Tween动画更加的方便,实用...而且比较简单...

Android 学习笔记多媒体技术之 Drawable类+Tween(补间动画)+Frame(帧动画)的更多相关文章

  1. Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...

    PS:今天搞了一下如何实现音频播放...结果被坑了,看书上写的代码是挺简单的,但是有个函数就是死活没看懂,这真是受不了...最后才弄明白,原来是一个实现异步任务的一个类...这个类使用java.uti ...

  2. 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...

  3. 【转】Pro Android学习笔记(十四):用户界面和控制(2):Text类控制

    目录(?)[-] TextView 例子1在XML中设置autoLink属性 例子2在代码中设置autoLink属性 EditText AutoCompleteTextView MultiAutoCo ...

  4. 【转】 Pro Android学习笔记(七七):服务(2):Local Service

    目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...

  5. 【转】Pro Android学习笔记(三):了解Android资源(上)

    在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源res ...

  6. Android学习笔记之滑动翻页(屏幕切换)

    如何实现手机上手动滑动翻页效果呢?呵呵,在这里我们就给你们介绍一下吧. 一般实现这个特效会用到一个控件:ViewFlipper <1>View切换的控件—ViewFlipper 这个控件是 ...

  7. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  8. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  9. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

随机推荐

  1. 实现微信公众号自动登陆自己的Web App

    测试: 基本的思路是通过公众号OAuth API获取用户微信的openid.第一次使用的时候让用户登录,然后在数据库里把openid和自己应用的userid对应起来.以后获得用户的openid之后就可 ...

  2. 定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表

    最近项目中有一种需求: 大致需求是这样的 通过给定的 用户名和密码 要定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表 项目的结构式struts1 hibernat ...

  3. ASP.NET中彩票项目中的计算复式投注的注数的方法

    从别人做的项目中抽取出的代码:

  4. iSAC测试报告

    iSAC测试报告 测试码流:24k bit/s 测试环境:三星i9250  CPU 1.2G*2   ram:1G  TI芯片  OMAP 4460 双核1.2GHz MOTO ME722  CPU ...

  5. Visual Studio 2010配置Opencv2.4.9

    转自: http://blog.csdn.net/huang9012/article/details/21811129 这篇文章作为OpenCV的启程篇,自然少不了先系统地介绍OpenCV开发环境的配 ...

  6. Windows下干活儿辅助软件

    桌面下高速文件搜索软件:Listary Pro(收费)和Everything(开源免费),Everything推荐Beta版,明显比老旧的稳定版好用. 桌面太乱,可以试试Fences(收费). 需要文 ...

  7. 【网络——Linux】——IPMI详细介绍【转】

    一.IPMI含义 智能平台管理接口(IPMI:Intelligent Platform Management Interface)是一项应用于服务器管理系统设计的标准,由Intel.HP.Dell和N ...

  8. Oracle外键不加索引会引起死锁问题

    转载链接:http://www.jb51.net/article/50161.htm 这篇文章主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下 --创建一个表,此表作为子表 ...

  9. Scala spark mongodb

    最好的参考是Mongo官网的地址 https://docs.mongodb.com/spark-connector/getting-started/ 需要截图所示的包 代码地址 https://git ...

  10. Ubuntu apt命令

    http://www.tecmint.com/useful-basic-commands-of-apt-get-and-apt-cache-for-package-management/ apt-ca ...