android动画设计

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>

加入了一个文本视图(屏幕居中)和一个控制按钮(放置在屏幕底部)

另外一个重要的工作时加入一个创建动画属性配置文件,从网上搞到一个牛人的配置文件,很详细,贴一下
(这里的工作是创建动画配置文件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{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}-100{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}中取值    
                                        50{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}为物件的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{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}"    
                android:pivotY="50{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}"    
                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{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}-100{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}中取值    
                50{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}为物件的X或Y方向坐标上的中点位置    
         -->    
        <rotate    
                android:interpolator="@android:anim/accelerate_interpolator"    
                android:repeatCount="2"    
                android:fromDegrees="0"    
                android:toDegrees="+270"    
                android:pivotX="50{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}"    
                android:pivotY="50{5351c8a62f918c9a2549d9888258dfab50bc32b8c1160430abfd6b919b9dbb4d}"    
                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);
  }

}

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>
和string.xml
<?xml version="1.0" encoding="utf-8"?> 
<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(); 
        } 
      } 
    }); 
  } 
}
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
京ICP备17066706号-1
0
希望看到您的想法,请您发表评论x