package com.sxjs.common.widget.view_switcher; import android.content.Context; import android.content.res.TypedArray; import android.support.annotation.LayoutRes; import android.util.AttributeSet; import android.view.View; import android.view.animation.TranslateAnimation; import android.widget.ViewSwitcher; import com.sxjs.common.R; import java.lang.ref.WeakReference; /** * Created by admin on 2017/3/21. */ public class UpDownViewSwitcher extends ViewSwitcher { private boolean isUpToDown; private int animator_duration; private int switch_duration; private float animator_translate_distance; private int index; @LayoutRes private int resourse; private AutoPlayTask mAutoPlayTask; private SwitchNextViewListener listener; public UpDownViewSwitcher(Context context) { this(context, null); } public UpDownViewSwitcher(Context context, AttributeSet attrs) { super(context, attrs); parseAttrs(context, attrs); init(); } private void parseAttrs(Context context, AttributeSet attrs) { if (attrs != null) { TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.UpDownViewSwitcher, 0, 0); isUpToDown = typedArray.getBoolean(R.styleable.UpDownViewSwitcher_up_to_down, true); animator_duration = typedArray.getInteger(R.styleable.UpDownViewSwitcher_animator_duration, 300); switch_duration = typedArray.getInteger(R.styleable.UpDownViewSwitcher_switch_duration, 3000); animator_translate_distance = typedArray.getDimension(R.styleable.UpDownViewSwitcher_animator_translate_distance,40); }else{ isUpToDown = true; animator_duration = 400; switch_duration = 3000; animator_translate_distance = getResources().getDimension(R.dimen.animator_translate_distance); } } public void setContentLayout(@LayoutRes int resourse){ if (this.resourse == 0){ this.resourse = resourse; setFactory(); } } private void init() { mAutoPlayTask = new AutoPlayTask(this); initAnimation(); } public void setFactory(){ if(resourse != 0){ super.setFactory(new ViewFactory() { @Override public View makeView() { return View.inflate(getContext(),resourse,null); } }); switchToNextView(); startAutoPlay(); } } private void initAnimation() { if(isUpToDown){ //设置切入动画 TranslateAnimation animationTop = new TranslateAnimation(0, 0, -animator_translate_distance, 0); animationTop.setDuration(animator_duration); setInAnimation(animationTop); //设置切出动画 TranslateAnimation animationBottom = new TranslateAnimation(0, 0, 0, animator_translate_distance); animationBottom.setDuration(animator_duration); setOutAnimation(animationBottom); }else{ //设置切入动画 TranslateAnimation animationTop = new TranslateAnimation(0, 0, animator_translate_distance, 0); animationTop.setDuration(animator_duration); setInAnimation(animationTop); //设置切出动画 TranslateAnimation animationBottom = new TranslateAnimation(0, 0, 0, -animator_translate_distance); animationBottom.setDuration(animator_duration); setOutAnimation(animationBottom); } } public void switchToNextView(){ if(listener != null){ listener.switchTONextView(this.getNextView(),index); this.showNext(); index++; } } public void startAutoPlay() { postDelayed(mAutoPlayTask,switch_duration); } public void stopAutoPlay() { if (mAutoPlayTask != null) { removeCallbacks(mAutoPlayTask); } } private static class AutoPlayTask implements Runnable { private final WeakReference<UpDownViewSwitcher> mSwitcher; private AutoPlayTask(UpDownViewSwitcher switcher) { mSwitcher = new WeakReference<>(switcher); } @Override public void run() { UpDownViewSwitcher switcher = mSwitcher.get(); if (switcher != null) { switcher.switchToNextView(); switcher.startAutoPlay(); } } } public interface SwitchNextViewListener { void switchTONextView(View nextView,int index); } public void setSwitcheNextViewListener(SwitchNextViewListener listener){ this.listener = listener; } }