结合BaseAdapter思想实现自定义ViewSwitcher

本文介绍了一种自定义的Android ViewSwitcher组件——AutoViewSwitcher,该组件能够实现自动循环显示不同的视图,并提供了详细的实现代码及动画效果设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
package com.csii.googlearc.view;

import android.content.Context;
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.ViewSwitcher;

import com.csii.googlearc.R;
import com.csii.googlearc.adapter.BaseViewSwitcherAdapter;

/**
 * Created by Administrator on 2018/5/30.
 * 自定义会自动切换的ViewSwitcher
 */

public class AutoViewSwitcher extends ViewSwitcher {

    private BaseViewSwitcherAdapter mAdapter = null;
    private int currentPosition = -1;
    private ItemClickListener itemClickListener = null;

    private static final long delayMillis = 2 * 1000;

    private Handler mainHandler = new Handler();

    private Runnable timerTask = new Runnable() {
        @Override
        public void run() {

            currentPosition++;
            formatPosition();
            showNextData(currentPosition);

            mainHandler.postDelayed(this, delayMillis);

        }
    };

    /**
     * 格式position
     */
    private void formatPosition() {

        if (currentPosition < 0) {

            currentPosition = 0;

        } else if (currentPosition >= getAdapter().getCount()) {

            currentPosition = currentPosition % getAdapter().getCount();
        }

    }

    public void setItemClickListener(ItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }

    public AutoViewSwitcher(Context context) {
        super(context);
        init();
    }

    public AutoViewSwitcher(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }


    public BaseViewSwitcherAdapter getAdapter() {
        return mAdapter;
    }

    public void setAdapter(BaseViewSwitcherAdapter mAdapter) {
        this.mAdapter = mAdapter;
        initAdapter();
    }

    private void init() {

        Animation in = AnimationUtils.loadAnimation(getContext(), R.anim.anim_bottom_in);
        Animation out = AnimationUtils.loadAnimation(getContext(), R.anim.anim_top_out);

        this.setInAnimation(in);
        this.setOutAnimation(out);

    }

    private void initAdapter() {

        if (getAdapter() != null) {

            this.setFactory(new ViewFactory() {
                @Override
                public View makeView() {
                    return getAdapter().getContentView();
                }
            });

            if (getAdapter().getCount() == 0) {

                for (int i = 0; i < getChildCount(); i++) {

                    View childAt = getChildAt(i);
                    childAt.setVisibility(View.INVISIBLE);

                }

            } else {

                for (int i = 0; i < getChildCount(); i++) {

                    View childAt = getChildAt(i);
                    childAt.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {

                            if (itemClickListener != null) {

                                itemClickListener.onItemClick(currentPosition);

                            }

                        }
                    });
                    childAt.setVisibility(View.VISIBLE);

                }

                loopViewSwitcher();
            }

        }

    }

    private void showNextData(int position) {

        getAdapter().bindData(getNextView(), position);
        showNext();
    }


    private void loopViewSwitcher() {

        mainHandler.post(timerTask);

    }

    public interface ItemClickListener {

        void onItemClick(int position);
    }

    /**
     * 停止动画
     */
    public void onStop() {

        mainHandler.removeCallbacks(timerTask);

    }

    /**
     * 开始动画
     */
    public void onStart() {

        onStop();
        mainHandler.post(timerTask);

    }


    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mainHandler != null) {

            mainHandler.removeCallbacks(timerTask);
        }
    }
}

package com.csii.googlearc.adapter;

import android.view.View;

/**
 * Created by Administrator on 2018/5/30.
 */

public interface BaseViewSwitcherAdapter {

    /**
     * 集合数量
     * @return
     */
    int getCount();

    /**
     * 可以绑定数据和Listener
     * @param contentView
     * @param position
     */
    void bindData(View contentView,int position);

    /**
     * 提供View
     * @return
     */
    View getContentView();
    
    
}

package com.csii.googlearc.adapter;

import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.csii.googlearc.R;
import com.csii.googlearc.bean.SwitcherViewBean;

import java.util.List;

/**
 * Created by Administrator on 2018/5/30.
 */

public class ViewSwitcherAdapter implements BaseViewSwitcherAdapter {

    private List<SwitcherViewBean> mList = null;
    private Context mContext = null;

    public ViewSwitcherAdapter(Context context,List<SwitcherViewBean> mList) {
        this.mContext = context;
        this.mList = mList;
    }

    @Override
    public int getCount() {
        return mList == null ? 0 : mList.size();
    }

    @Override
    public void bindData(View contentView,int position) {

        SwitcherViewBean bean = mList.get(position);

        TextView item_switcher_view_tv = (TextView) contentView.findViewById(R.id.item_switcher_view_tv);
        ImageView item_switcher_view_img = (ImageView) contentView.findViewById(R.id.item_switcher_view_img);

        item_switcher_view_tv.setText(bean.getMsg());
        item_switcher_view_img.setImageResource(bean.getDrawableRes());

    }

    @Override
    public View getContentView() {
        
        View contentView = View.inflate(mContext, R.layout.item_view_switcher,null);
        
        return contentView;
    }

}

        viewSwitcherAdapter = new ViewSwitcherAdapter(activity,mViewSwitcherList);
        autoviewswitcher_test.setAdapter(viewSwitcherAdapter);
anim_bottom_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:shareInterpolator="true">

    <translate
        android:fromYDelta="100%"
        android:toYDelta="0"></translate>

</set>

anim_top_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:shareInterpolator="true">

    <translate
        android:fromYDelta="0"
        android:toYDelta="-100%"></translate>

</set>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值