Step1 界面布局:依然是layout/main.xml
<?
xml
version
="1.0"
encoding
="utf-8"
?>
< RelativeLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< TextView
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:text ="@string/hello"
android:id ="@+id/text"
android:layout_centerHorizontal ="true"
android:layout_centerVertical ="true"
/>
< Button
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:id ="@+id/rotate"
android:text ="Rotate"
android:layout_alignParentBottom ="true"
>
</ Button >
</ RelativeLayout >
< RelativeLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< TextView
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:text ="@string/hello"
android:id ="@+id/text"
android:layout_centerHorizontal ="true"
android:layout_centerVertical ="true"
/>
< Button
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:id ="@+id/rotate"
android:text ="Rotate"
android:layout_alignParentBottom ="true"
>
</ Button >
</ RelativeLayout >
加入了一个文本视图(屏幕居中)和一个控制按钮(放置在屏幕底部)
另外一个重要的工作时加入一个创建动画属性配置文件,从网上搞到一个牛人的配置文件,很详细,贴一下
(这里的工作是创建动画配置文件ani_rotate.xml,创建位位置:res文件夹下创建anim/ani_rotate.xml)
<?
xml
version
="1.0"
encoding
="utf-8"
?>
< set xmlns:android ="http://schemas.android.com/apk/res/android" >
<!--
Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效
Alpha:渐变透明度动画效果
Scale:渐变尺寸伸缩动画效果
Translate:画面转换位置移动动画效果
Rotate:画面旋转动画效果
Tween Animation 通用属性[类型] 功能
Duration[long] 属性为动画持续时间 时间以毫秒为单位
fillAfter [boolean] 当设置为true ,该动画转化在动画结束后被应用
fillBefore[boolean] 当设置为true ,该动画转化在动画开始前被应用
interpolator 指定一个动画的插入器 有一些常见的插入器
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
其他的属于特定的动画效果
repeatCount[int] 动画的重复次数
RepeatMode[int] 定义重复的行为 1:重新开始 2:plays backward
startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变
1:保持在最上层
-1:保持在最下层
-->
<!--
透明控制动画
-->
< alpha
android:fromAlpha ="0.1"
android:toAlpha ="1.0"
android:duration ="3000"
/>
<!-- 尺寸伸缩动画效果 scale
属性:interpolator 指定一个动画的插入器
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
其他的属于特定的动画效果
fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
toXScale 属性为动画结束时 X坐标上的伸缩尺寸
fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
toYScale 属性为动画结束时Y坐标上的伸缩尺寸
说明:
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
布尔型值:
fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
-->
< scale
android:interpolator ="@android:anim/accelerate_decelerate_interpolator"
android:repeatCount ="1"
android:fromXScale ="0.5"
android:fromYScale ="0.5"
android:toXScale ="1.4"
android:toYScale ="1.4"
android:pivotX ="50%"
android:pivotY ="50%"
android:fillAfter ="false"
android:duration ="3000"
/>
<!--
画面转换位置移动动画效果 translate
fromXDelta toXDelta 为动画、结束起始时 X坐标上的位置
fromYDelta toYDelta 为动画、结束起始时 Y坐标上的位置
-->
< translate
android:repeatCount ="2"
android:fromXDelta ="-30"
android:fromYDelta ="-30"
android:toXDelta ="-80"
android:toYDelta ="200"
android:duration ="3000"
/>
<!--
画面转移旋转动画效果 rotate
fromDegrees 为动画起始时物件的角度 说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
pivotX
pivotY 为动画相对于物件的X、Y坐标的开始位 说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
-->
< rotate
android:interpolator ="@android:anim/accelerate_interpolator"
android:repeatCount ="2"
android:fromDegrees ="0"
android:toDegrees ="+270"
android:pivotX ="50%"
android:pivotY ="50%"
android:duration ="3000"
/>
</ set >
< set xmlns:android ="http://schemas.android.com/apk/res/android" >
<!--
Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效
Alpha:渐变透明度动画效果
Scale:渐变尺寸伸缩动画效果
Translate:画面转换位置移动动画效果
Rotate:画面旋转动画效果
Tween Animation 通用属性[类型] 功能
Duration[long] 属性为动画持续时间 时间以毫秒为单位
fillAfter [boolean] 当设置为true ,该动画转化在动画结束后被应用
fillBefore[boolean] 当设置为true ,该动画转化在动画开始前被应用
interpolator 指定一个动画的插入器 有一些常见的插入器
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
其他的属于特定的动画效果
repeatCount[int] 动画的重复次数
RepeatMode[int] 定义重复的行为 1:重新开始 2:plays backward
startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变
1:保持在最上层
-1:保持在最下层
-->
<!--
透明控制动画
-->
< alpha
android:fromAlpha ="0.1"
android:toAlpha ="1.0"
android:duration ="3000"
/>
<!-- 尺寸伸缩动画效果 scale
属性:interpolator 指定一个动画的插入器
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
其他的属于特定的动画效果
fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
toXScale 属性为动画结束时 X坐标上的伸缩尺寸
fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
toYScale 属性为动画结束时Y坐标上的伸缩尺寸
说明:
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
布尔型值:
fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
-->
< scale
android:interpolator ="@android:anim/accelerate_decelerate_interpolator"
android:repeatCount ="1"
android:fromXScale ="0.5"
android:fromYScale ="0.5"
android:toXScale ="1.4"
android:toYScale ="1.4"
android:pivotX ="50%"
android:pivotY ="50%"
android:fillAfter ="false"
android:duration ="3000"
/>
<!--
画面转换位置移动动画效果 translate
fromXDelta toXDelta 为动画、结束起始时 X坐标上的位置
fromYDelta toYDelta 为动画、结束起始时 Y坐标上的位置
-->
< translate
android:repeatCount ="2"
android:fromXDelta ="-30"
android:fromYDelta ="-30"
android:toXDelta ="-80"
android:toYDelta ="200"
android:duration ="3000"
/>
<!--
画面转移旋转动画效果 rotate
fromDegrees 为动画起始时物件的角度 说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
pivotX
pivotY 为动画相对于物件的X、Y坐标的开始位 说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
-->
< rotate
android:interpolator ="@android:anim/accelerate_interpolator"
android:repeatCount ="2"
android:fromDegrees ="0"
android:toDegrees ="+270"
android:pivotX ="50%"
android:pivotY ="50%"
android:duration ="3000"
/>
</ set >
Step 2 Java控制代码:
package com.penguin7.animationtest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
public class AnimationTest extends Activity implements OnClickListener{
private Button bntRotate = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取按键资源
bntRotate = (Button) findViewById(R.id.rotate);
//启动按键监听
bntRotate.setOnClickListener( this);
}
@Override
public void onClick(View v){
//定义动画属性
Animation ani = AnimationUtils.loadAnimation( this, R.anim.ani_rotate);
//启动动画
findViewById(R.id.text).startAnimation(ani);
}
}
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
public class AnimationTest extends Activity implements OnClickListener{
private Button bntRotate = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取按键资源
bntRotate = (Button) findViewById(R.id.rotate);
//启动按键监听
bntRotate.setOnClickListener( this);
}
@Override
public void onClick(View v){
//定义动画属性
Animation ani = AnimationUtils.loadAnimation( this, R.anim.ani_rotate);
//启动动画
findViewById(R.id.text).startAnimation(ani);
}
}
Step 3 看看效果:
启动画面:
动画截屏:
今天学习到一个比较好的API类——Toast(一种为用户快速提醒信息的一种机制),结合一个拨电话的程序顺便还能温习一下Intent类,一举两得,顺便做个笔录。
这两天才了解的一个Android另外一个优点就是大家可以调用已有的程序,完成更强大的程序功能。比如说这个实验可以完成对Gphone Dialer的调用,虽然做法有些土鳖,主要是用来学习知识也不错。
今天的工作有创建一个输入框用来输入要拨打的电话号码,借助PhoneNumberUtils.isGlobalPhoneNumber方法校验一下输入的号码是否正确,如果正确启动Dialer完成拨打电话的工作,如果输入的电话号码不符合常规的号码格式,使用Toast类的MakeText 方法为用户做出一个简单的提示“号码无效,请从新输入”。
不废话,直接三部曲开工。
Step1:界面框架布局设置main.xml
<?
xml
version
="1.0"
encoding
="utf-8"
?>
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< EditText
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:hint ="Please input the phone number you want to dial here"
android:id ="@+id/dial_input"
>
</ EditText >
< Button
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="@string/dial_btn"
android:id ="@+id/dial_btn"
>
</ Button >
</ LinearLayout >
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< EditText
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:hint ="Please input the phone number you want to dial here"
android:id ="@+id/dial_input"
>
</ EditText >
< Button
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="@string/dial_btn"
android:id ="@+id/dial_btn"
>
</ Button >
</ LinearLayout >
和string.xml
<?
xml
version
="1.0"
encoding
="utf-8"
?>
< resources >
< string name ="dial_btn" >Dial! </ string >
< string name ="app_name" >PhoneDial </ string >
</ resources >
< resources >
< string name ="dial_btn" >Dial! </ string >
< string name ="app_name" >PhoneDial </ string >
</ resources >
Step: Java代码
package com.penguin7.phonedial;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class PhoneDial extends Activity {
private Button btnDial = null;
private EditText et = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//文本编辑变量,用于接收视图EditText获取的号码
et = (EditText) findViewById(R.id.dial_input);
//启动Dialer程序Button变量
btnDial = (Button) findViewById(R.id.dial_btn);
btnDial.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String phoneNum = et.getText().toString();
//isGlobalPhoneNumber方法用来检验输入的串是否是有效的号码
if (PhoneNumberUtils.isGlobalPhoneNumber(phoneNum)) {
//有效地电话号码,启动Dialer程序(用宏ACTION_DIAL来标示)
//Intent传递号码信息需要从字符串转化为URI变量,
//并以tel://起头
Intent iDial = new Intent(Intent.ACTION_DIAL, Uri
.parse( "tel://" + phoneNum));
//启动Dialer程序
startActivity(iDial);
} else {
//无效的号码,提示用户输入错误
Toast.makeText(PhoneDial.this,
"not a valid number, please have a check",
Toast.LENGTH_LONG).show();
}
}
});
}
}
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class PhoneDial extends Activity {
private Button btnDial = null;
private EditText et = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//文本编辑变量,用于接收视图EditText获取的号码
et = (EditText) findViewById(R.id.dial_input);
//启动Dialer程序Button变量
btnDial = (Button) findViewById(R.id.dial_btn);
btnDial.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String phoneNum = et.getText().toString();
//isGlobalPhoneNumber方法用来检验输入的串是否是有效的号码
if (PhoneNumberUtils.isGlobalPhoneNumber(phoneNum)) {
//有效地电话号码,启动Dialer程序(用宏ACTION_DIAL来标示)
//Intent传递号码信息需要从字符串转化为URI变量,
//并以tel://起头
Intent iDial = new Intent(Intent.ACTION_DIAL, Uri
.parse( "tel://" + phoneNum));
//启动Dialer程序
startActivity(iDial);
} else {
//无效的号码,提示用户输入错误
Toast.makeText(PhoneDial.this,
"not a valid number, please have a check",
Toast.LENGTH_LONG).show();
}
}
});
}
}