Android 轮播

来源:互联网 发布:人工智能行业分析 编辑:程序博客网 时间:2024/05/21 10:27

使用的控件是viewpager

布局结构

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="210dp" >

        <com.example.study_viewpager.CustomViewPager
            android:id="@+id/vp_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </com.example.study_viewpager.CustomViewPager>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_gravity="bottom"
            android:background="@android:color/darker_gray"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:gravity="center"
                android:padding="2dp"
                android:text="中国人名站起来了"
                android:textColor="@android:color/white" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:orientation="horizontal" >

                <View
                    android:id="@+id/view_01"
                    android:layout_width="5dp"
                    android:layout_height="5dp"
                    android:layout_marginLeft="2dp"
                    android:layout_marginRight="2dp"
                    android:background="@drawable/point_fouce" />

                <View
                    android:id="@+id/view_02"
                    android:layout_width="5dp"
                    android:layout_height="5dp"
                    android:layout_marginLeft="2dp"
                    android:layout_marginRight="2dp"
                    android:background="@drawable/point_nomal" />

                <View
                    android:id="@+id/view_03"
                    android:layout_width="5dp"
                    android:layout_height="5dp"
                    android:layout_marginLeft="2dp"
                    android:layout_marginRight="2dp"
                    android:background="@drawable/point_nomal" />

                <View
                    android:id="@+id/view_04"
                    android:layout_width="5dp"
                    android:layout_height="5dp"
                    android:layout_marginLeft="2dp"
                    android:layout_marginRight="2dp"
                    android:background="@drawable/point_nomal" />

                <View
                    android:id="@+id/view_05"
                    android:layout_width="5dp"
                    android:layout_height="5dp"
                    android:layout_marginLeft="2dp"
                    android:layout_marginRight="2dp"
                    android:background="@drawable/point_nomal" />
            </LinearLayout>
        </LinearLayout>
    </FrameLayout>

</RelativeLayout>


CustomViewPager  这个可以直接用v4包的viewpager替换


这是 实现的代码

package com.example.study_viewpager;

import java.util.ArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 实现轮播效果
 *
 * @author An
 *
 */
public class MainActivity extends Activity {

    /*
     * 设置的背景图片*
     */
    private int[] imageId = new int[] { R.drawable.a, R.drawable.b,
            R.drawable.c, R.drawable.d, R.drawable.e };
    /**
     * 设置的图片的title
     */
    private String strTitle[] = new String[] { "刘丽来了", " 琉璃来了    ", "浏览来了",
            "流量来了", "流离来了" };

    /** 用来存放ImageView对象的 */
    private ArrayList<ImageView> imageViews;

    /** Viewpager对象 */
    private CustomViewPager viewPager;

    /** 这个主要是图片切换时候的圆点背景变换 */
    private ArrayList<View> pointArray;

    /** 记录上一个点的位置 */
    private int lastPosition;

    /** 文字描叙 */
    private TextView tvTitle;

    /** 记录当前的位置 */
    private int currentPosition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
    }

    private void initData() {
        // 初始化结合对象
        imageViews = new ArrayList<>();
        for (int i = 0; i < imageId.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setImageResource(imageId[i]);
            imageViews.add(imageView);

imageView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    Toast.makeText(MainActivity.this, strTitle[currentPosition], 1).show();
                }
            });
        }
        pointArray = new ArrayList<View>();
        pointArray.add(findViewById(R.id.view_01));
        pointArray.add(findViewById(R.id.view_02));
        pointArray.add(findViewById(R.id.view_03));
        pointArray.add(findViewById(R.id.view_04));
        pointArray.add(findViewById(R.id.view_05));

        viewPager = (CustomViewPager) findViewById(R.id.vp_viewpager);
        tvTitle = (TextView) findViewById(R.id.tv_title);

        ViewPagerAdapter adapter = new ViewPagerAdapter();
        // 类似listview 设置一个adapter
        viewPager.setAdapter(adapter);
        viewPager.setPageTransformer(true, new PageTransformer() {
            
            @Override
            public void transformPage(View arg0, float arg1) {
                // TODO Auto-generated method stub
                
            }
        });
        // 图片切换的过程
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                // 图片切换的时候页面的
                pointArray.get(arg0).setBackgroundResource(
                        R.drawable.point_fouce);

                pointArray.get(lastPosition).setBackgroundResource(
                        R.drawable.point_nomal);
                lastPosition = arg0;
                tvTitle.setText(strTitle[arg0]);
                currentPosition = arg0;

            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        });

    }

    private class ViewPagerAdapter extends PagerAdapter {

        // 和baseadapter类似的
        @Override
        public int getCount() {
            return imageViews.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        // 移除一个对象
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(imageViews.get(position));

        }

        // 添加一个对象
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(imageViews.get(position));
            return imageViews.get(position);
        }

    }

    @Override
    protected void onStart() {
        super.onStart();
        ScheduledExecutorService service = Executors
                .newSingleThreadScheduledExecutor();
        service.scheduleWithFixedDelay(new ViewPagerTask(), 2, 4,
                TimeUnit.SECONDS);
    }

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

    // 计时器 Timer坏处 是一个基于绝对时间 ,而不是基于相对时间,所以启动一个线程池任务去完成计时
    private class ViewPagerTask implements Runnable {

        @Override
        public void run() {
            // 当跳转到下一个位置的时候 重新计算位置 例如当前是 3 ,+1 = 4,
            currentPosition = (currentPosition + 1) % imageViews.size();
            // 主线程更新界面
            runOnUiThread(new Runnable() {
                public void run() {
                    viewPager.setCurrentItem(currentPosition);
                }
            });
        }
    }

}
这里面的图片是本地的,网络的也可以实现替换

当然还可以给图片的切换提供各种动画 viewpager 中有个setPageTransformerset(arg0 ,arg1), 网上有很多这方面的例子可以查看




0 0