Android学习笔记之资源(下)

动画资源

Android SDK支持3种动画:属性动画,帧动画和补间动画。
属性动画
属性动画从API Level = 11(Android 3.0)才开始支持。
属性动画可以使对象的属性值在一定时间间隔内变化到某一值。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">

    <objectAnimator
        android:duration="2000"
        android:propertyName="y"
        android:valueTo="300"
        android:valueType="intType"/>
    <objectAnimator
        android:duration="3000"
        android:propertyName="x"
        android:valueTo="220"
        android:valueType="intType"/>
</set>

android:ordering属性指定< set>标签中动画的执行顺序,本例是按顺序执行,默认是同时执行。因此上述代码先将y属性值在2000毫秒内变为300,然后将对象的x属性值在3000毫秒内变为220.

import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Created by Wallace(wangj) on 2015/4/23 0023.
 */
public class MyActivity extends Activity{
    private Button button;
    private Move move;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.btn1);
        move = new Move();
    }
    //对Move对象使用属性动画
    class Move{
        private int x;
        private int y;

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
            //垂直移动
            button.layout(button.getLeft(),y,button.getRight(),y + button.getMeasuredHeight());
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
            //水平移动
            button.layout(x,button.getTop(),x + button.getMeasuredWidth(),button.getBottom());
        }
    }
    //"Move"按钮的单击事件
    public void onClick_Move(View view){
        AnimatorSet set =(AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.proper_anim);
        //设置要控制的对象
        set.setTarget(move);
        set.start();
    }
}

帧动画
帧动画类似电影的播放。电影一般每秒至少播放25幅静态的图像(25帧)。
帧动画必须使用< animation-list>标签作为根节点,如果android:oneshot属性值为true,表示只播放一次,否则无限循环。
每个< item>表示一个静态图android:duration表示当前图像停留时间。使用帧动画资源需要先装载资源文件,并转换成AnimationDrawble对象,然后调用AnimationDrawble.start方法开始播放帧动画。

实现本例首先需要准备若干个图像文件,然后在res/anim目录建立资源文件

<animation-list
xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
    <item android:drawable="@drawable/anim1" android:duration="50"/>
    <item android:drawable="@drawable/anim2" android:duration="50"/>
    <item android:drawable="@drawable/anim3" android:duration="50"/>
    ......
    </animation-list>

java代码

public class MainActivity extends Activity implements OnClickListener{

private ImageView ivAnimView;
private AnimationDrawable animationDrawable;
private AnimationDrawable animationDrawable2;
private Button btnAddFrame;
@Override
public void onClick(View view){
    switch(view.getId()){
    //只播放一次动画
    case R.id.btnOneShot:
        //动态的修改android:oneshot属性
        animationDrawable.setOneShot(true);
        //需要先停止动画,然后再开始动画设置
        animationDrawable.stop();
        //开始播放
        animationDrawable.start();
    break;
    //循环播放
    case R.id.btnSartAnim:
        animationDrawable.setOneShot(false);
        animationDrawable.stop();
        animationDrawable.start();
    break;
    //停止播放
    case R.id.btnStopAnim:
        //先停止第一个帧动画
        animationDrawable.stop();
        if(animationDrawable1 != null){
             //如果添加了第2个帧动画,则同时停止第2个帧动画
             animationDrawable1.stop();
        }
    break;
    //在第1个帧动画后添加第2个帧动画
    case R.id.btnAddFrame:
        //装载第2个帧动画
        animationDrawable1 = (AnimationDrawable) getResources().getDrawable(R.anim.frame_anim);
        //设置第2个帧动画停留的时间,不管这段时间帧动画是否播放完,都切换到第二个帧动画
        anmationDrawable.addFrame(animationDrawable1,2000);
        btnAddFrame.setEnabled(false);
    break;
    }
}
....

记得添加帧动画到背景图
帧动画还可以通过AnimationDrawable.setAlpha方法设置透明度 0~255,0表示不透明,255表示完全透明。
补间动画
补间动画有移动,透明度,缩放和旋转的效果
可以通过配置xml文件或java代码来实现。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <!--
       透明度控制动画效果alpha
         浮点型值:
         fromAlpha  动画起始时透明度
         toAlpha    动画结束时透明度
                               说明:0.0  完全透明
         1.0  完全不透明
         以上值取0.0-1.0之间的 float数据类型的数字

       长整型:
       duration  为动画持续时间
       说明:时间以毫秒为单位

    -->
    <alpha
        android:duration="3000"
        android:fromAlpha="0.1"
        android:toAlpha="1.0" />

    <!-- 尺寸伸缩动画效果 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%中取值

       长整型:
       duration 动画持续时间
       说明:时间以毫秒为单位

       布尔型值:
       fillAfter 当设置为true,该动画转化在动画结束后被应用
     -->
    <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
           android:fromXScale="0.0"
           android:toXScale="1.4"
           android:fromYScale="0.0"
           android:toYScale="1.4"
           android:pivotX="50%"
           android:pivotY="50%"
           android:fillAfter="false"
           android:duration="700"/>

    <!-- translate 位置转移动画效果
          整型值:fromXDelta 动画起始时 X坐标上的位置 
           toXDelta 动画结束时 X坐标上的位置
            fromYDelta 动画起始时 Y坐标上的位置
            toYDlta 动画结束时 Y坐标上的位置
            注意:没有指定fromXTra toXType fromYType toYType 时候,默认是以自己为相对参照物

            长整型:duration 为动画持续时间
                                时间以毫秒为单位-->

    <translate android:fromXDelta="30"
               android:toXDelta="-80"
               android:fromYDelta="30"
               android:toYDelta="300"
               android:duration="2000"/>

    <!-- rotate旋转动画效果


                 浮点整型值:
                 fromDegrees 为动画起始时物件的角度
                 toDegrees 为动画起始时物件旋转的角度 可以大于360度
                 说明:当角度为负数——表示逆时针旋转
                                当角度为正数——表示顺时针旋转
                                (负数from——to正数:顺时针旋转
                                     负数from——to负数:逆时针旋转
                                     正数from——to正数:顺时针旋转)

      pivotX 为动画相对于物件的X坐标的开始位置
      pivotY 为动画相对于物件的Y坐标的开始位置
      说明:以上两个属性值 从0%——100%中取值
        50%为物件的X或Y方向坐标上的中点位置

      长整型类型:
      duration  为动画持续时间
      说明:时间以毫秒为单位
          -->
    <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:fromDegrees="0"
            android:toDegrees="+350"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="3000"/>
</set>

风格(Style)资源与主题(Theme)

风格资源使用< style>标签定义,需要在res/values目录中的任意xml文件格式的文件中设置,主要是用来成批设置属性。

<style name="ViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_weight">1</item>
        <item name="android:textSize">24sp</item>
        <item name="android:gravity">center</item>
    </style>
    <!-- 继承系统的Theme风格资源改变主题 -->
    <style name="AppTheme" parent="@android:style/Theme">
        <item name="android:background">#fff</item>
    </style>

然后就是引用。
风格资源可以设置系统属性,也可以设置自定义属性。
自定义属性,必须使用< declare-styleable>标签定义,每一个自定义属性用一个< attr>标签指定,使用format属性设置属性值的类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值