动画切换view布局,可用于滚屏显示评论等例子
package com.example.animationviewdemo; import android.content.Context; import android.content.res.TypedArray; import android.os.Handler; import android.util.AttributeSet; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.ListAdapter; /** * 动画切换View */ public class AnimationView extends FrameLayout implements Runnable { private static final int DEFAULT_TIME_SPAN = 3000; /** * 当前显示view序号 */ private int index = 0; /** * 切换时间 */ private int timeSpan = DEFAULT_TIME_SPAN; /** * 切出view */ private View firstView; /** * 切入view */ private View secondView; /** * 切入动画 */ private Animation inAnim; /** * 切出动画 */ private Animation outAnim; /** * view列表适配器 */ private ListAdapter adapter; private Handler handler = new Handler(); public AnimationView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public AnimationView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.AnimationView); timeSpan = ta.getInteger(R.styleable.AnimationView_time_span, DEFAULT_TIME_SPAN); int animInId = ta.getResourceId(R.styleable.AnimationView_anim_in, android.R.anim.slide_in_left); inAnim = AnimationUtils.loadAnimation(context, animInId); inAnim.setFillAfter(true); int animOutId = ta.getResourceId(R.styleable.AnimationView_anim_out, android.R.anim.slide_out_right); outAnim = AnimationUtils .loadAnimation(context, animOutId); outAnim.setFillAfter(true); ta.recycle(); } /** * 开始 */ public void start() { if(adapter == null || adapter.getCount() == 0) return; removeAllViews(); firstView = adapter.getView(index, null, null); addView(firstView); secondView = null; handler.postDelayed(this, timeSpan); } /** * 停止 */ public void stop() { handler.removeCallbacks(this); } public ListAdapter getAdapter() { return adapter; } public void setAdapter(ListAdapter adapter) { this.adapter = adapter; handler.removeCallbacks(this); index = 0; } @Override public void run() { if (firstView == null) { firstView = adapter.getView(index, null, null); addView(firstView); } else { firstView = adapter.getView(index, firstView, this); } ++index; if (index >= adapter.getCount()) { index = 0; } if (secondView == null) { secondView = adapter.getView(index, null, null); addView(secondView); } else { secondView = adapter.getView(index, secondView, this); } firstView.startAnimation(outAnim); secondView.startAnimation(inAnim); handler.postDelayed(this, timeSpan); } public int getTimeSpan() { return timeSpan; } public void setTimeSpan(int timeSpan) { this.timeSpan = timeSpan; } }
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="AnimationView"> <attr name="time_span" format="integer" /> <attr name="anim_in" format="reference" /> <attr name="anim_out" format="reference" /> </declare-styleable> </resources>
demo链接:
http://git.oschina.net/lonelycoder/AnimationViewDemo
时间: 2024-12-25 06:02:47