Android 学习笔记多媒体技术之 Drawable类+Tween(补间动画)+Frame(帧动画)
学习内容:
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(帧动画)的更多相关文章
- Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...
PS:今天搞了一下如何实现音频播放...结果被坑了,看书上写的代码是挺简单的,但是有个函数就是死活没看懂,这真是受不了...最后才弄明白,原来是一个实现异步任务的一个类...这个类使用java.uti ...
- 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...
- 【转】Pro Android学习笔记(十四):用户界面和控制(2):Text类控制
目录(?)[-] TextView 例子1在XML中设置autoLink属性 例子2在代码中设置autoLink属性 EditText AutoCompleteTextView MultiAutoCo ...
- 【转】 Pro Android学习笔记(七七):服务(2):Local Service
目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...
- 【转】Pro Android学习笔记(三):了解Android资源(上)
在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源res ...
- Android学习笔记之滑动翻页(屏幕切换)
如何实现手机上手动滑动翻页效果呢?呵呵,在这里我们就给你们介绍一下吧. 一般实现这个特效会用到一个控件:ViewFlipper <1>View切换的控件—ViewFlipper 这个控件是 ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- Android学习笔记进阶之在图片上涂鸦(能清屏)
Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
随机推荐
- 【高德地图API】如何设置Icon的imageSize?
在地图开发中,我们需要把标注换成各种各样的图片,以突显个性. 在高分辨率的手机下,图片尺寸需要压缩至一半,以保持图片清晰.让我们来看一看,应该如何实现. 有开发者为了改变图片的尺寸,直接写成了 ...
- Parallel的陷阱
,).ToArray(); ; Parallel.For<int>( fromInclusive: , toExclusive: nums.Length, /* 陷阱 */ localIn ...
- php内存缓存
1.文件方式缓存 哈希子目录缓存 2.APC APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”.它为我们提供了缓存和优化PHP的中间代码的框架. APC的缓存分两 ...
- pip 安装psycopg的错误
psycopg包安装有点问题,特别是在windows下,pip从requirements.txt批量安装总是出错,发现是这个包的问题. 这里需要用easy_install来装,因为gfw的问题,最好下 ...
- 查看mysql版本的四种方法
1:在终端下:mysql -V. 以下是代码片段: [shengting@login ~]$ mysql -V mysql Ver 14.7 Distrib 4.1.10a, for redhat-l ...
- Nginx开发从入门到精通 学习目录分享学习 (阿里著作)
Nginx开发从入门到精通 缘起 nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部 ...
- Python中import的使用
python中的import语句是用来导入模块的,在python模块库中有着大量的模块可供使用,要想使用这些文件需要用import语句把指定模块导入到当前程序中. import语句的作用 import ...
- [AX2012]发送广播邮件
AX 2012可以使用MAPI或者SMTP发送邮件,MAPI是客户端方法,需要outlook的协作,而SMTP则是服务器端方法,要求SMTP允许AOS服务器通过它中继.这里要讲的就是如何通过SMTP发 ...
- fedora Server 21 安装 Opera 29.0.1795.47
最新文章:Virson's Blog 安装源: yum localinstall --nogpgcheck http://mirror.yandex.ru/fedora/russianfedora/r ...
- 开发Android必知的工具
程序开发有时候非常依赖使用的开发工具,好的完备的开发工具可以让开发人员的工作效率有大幅度的提高.开发Android也是如此,大家可能都离不开Eclipse或Android Studio这些工具,但他们 ...