Android开发之50个常见实用技巧——添加悦目的动画效果

Hack.5 使用TextSwitcher和ImageSwitcher实现平滑过渡

  实现步骤:

    1、通过findViewById()方法获取TextSwitcher对象的引用Swithcer,当然也可直接在代码中构造持续对象;

    2、通过Switcher.setFactory()方法指定TextSwitcher的ViewFactory;

    3、通过Switcher的.setInAnimation()方法设置换人动画效果;

    4、通过Switcher.setOutAnimation 方法设置换出动画效果。

  代码如下:

 1 private TextSwitcher mTextSwitcher;
 2 
 3 @Override
 4 public void onCreate(Bundle savedInstanceState) {
 5     super.onCreate(savedInstanceState);
 6     setContentView(R.layout.main);
 7     Animation in = AnimationUtils.loadAnimation(this,
 8     android.R.anim.fade_in);
 9     Animation out = AnimationUtils.loadAnimation(this,
10     android.R.anim.fade_out);
11     mTextSwitcher = (TextSwitcher) findViewById(R.id.your_textview);
12     mTextSwitcher.setFactory(new ViewFactory() {
13         @Override
14         public View makeView() {
15               TextView t = new TextView(YourActivity.this);
16               t.setGravity(Gravity.CENTER);17         return t;
18     }
19   });
20   mTextSwitcher.setInAnimation(in);
21   mTextSwitcher.setOutAnimation(out);
22 }

 

Hack.6 为ViewGroup的子视图添加悦目的动画效果

  步骤:

    1、获取ListView的引用;

    2、创建默认动画集合对象,AnimationSet;

    3、创建透明度渐变动画,移位动画,分别为AlphaAnimation,TranslateAnimation;

    4、创建LayoutAnimationController对象并设置子视图,动画效果持续时间;

    5、将LayoutAnimationController对象设置到ListView中;

    关键代码如下:

mListView = (ListView) findViewById(R.id.my_listview_id);

AnimationSet set = new AnimationSet(true);

Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(50);
set.addAnimation(animation);

animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
    -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
animation.setDuration(100);
set.addAnimation(animation);

LayoutAnimationController controller = 
    new LayoutAnimationController(set, 0.5f); mListView.setLayoutAnimation(controller);

 

 

   

 Hcak.7 在Canvas上显示动画 

  关于Canvas:  

    可以把 Canvas 视为 Surface 的替身或者接口,图形便是绘制在 Surface 上的。Canvas 封装了所有绘图调用。通过 Canvas,绘制

  到 Surface 上的内容首先存储到与之关联的 Bitmap 中,该 Bitmap最终会呈现到窗口上。

    在onDraw()方法中调用。。。

  关键代码如下:

    Activity代码:

public class MainActivity extends Activity {
    private DrawView mDrawView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         Display display = getWindowManager().getDefaultDispla y();
         mDrawView = new DrawView(this);
         mDrawView.height = display.getHeight();
         mDrawView.width = display.getWidth();
         setContentView(mDrawView);
    }
}

 

    DrawView类:

public class DrawView extends View {
    private Rectangle mRectangle;
    public int width;
    public int height;
    public DrawView(Context context) {
        super(context);
        mRectangle = new Rectangle(context, this);
        mRectangle.setARGB(255, 255, 0, 0);
        mRectangle.setSpeedX(3);
        mRectangle.setSpeedY(3);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        mRectangle.move();
        mRectangle.onDraw(canvas);
        invalidate();
    }
}

 

  分析:

    1、创建一个Rectangle实例,代表一个方块;Rectangle类内部实现了将自身绘制到Canvas上的逻辑,

      并且已经包含了正确变换其位置的代码逻辑。

    2、当调用onDraw()方法时,通过move()方法,方块的位置就会改变

    3、通过onDraw()方法绘制到Canvas上;

    4、在invalidate()中,强制重绘视图。

  其实,就是通过循环调用Rectangle的move()和onDraw()方法实现一个动画效果。

 

Hack.8 附加Ken Burns 特效的幻灯片

  要创建Ken Burns特效,需要预设一些动画

  案例分析:

    将动画随机应用到ImageView,当一个动画显示完毕,即开始显示另一个动画和图片;

    主布局使用FrameLayout,把ImageView置于该布局;

  代码如下:

    略。。。

  旧动画API的特点:  

    1、只支持视图对象的动画效果

    2、仅限于移动、旋转、缩放、渐变等效果

    3、只改变视图移动时的视觉效果,并未改变其真实位置属性

  

posted @ 2016-04-26 22:48  AnglusWang  阅读(474)  评论(0编辑  收藏  举报