ViewPager实现广告轮播---(一)(无限循环)

本文介绍使用Android的Viewpager实现广告轮播效果的方法,包括文本和指示点的联动更新,通过自定义适配器及页面更改监听实现无限循环播放。

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

Viewpager实现的广告轮播,有文本、有的联动效果

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.administrator.viewpagercarousel.MainActivity">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager1"
        android:layout_width="match_parent"
        android:layout_height="180dp">

    </android.support.v4.view.ViewPager>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/viewpager1"
        android:background="@color/back"
        android:orientation="vertical"
        android:padding="8dp">

        <TextView
            android:id="@+id/tvTest"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:ellipsize="end"
            android:singleLine="true"
            android:text="文本内容"
            android:textColor="#ffffff"
            android:textSize="16sp"/>

        <LinearLayout
            android:id="@+id/dot"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="3dp"
            android:orientation="horizontal">
        </LinearLayout>
    </LinearLayout>


</RelativeLayout>

代码


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import bean.Ad;

public class MainActivity extends Activity {

    private List<Ad> adlist;

    ViewPager mViewpager1;
    TextView mTvTest;
    LinearLayout mDot;

    //定时器
    private Handler h = new Handler() {
        public void handleMessage(Message msg) {
            mViewpager1.setCurrentItem(mViewpager1.getCurrentItem() + 1);
            h.sendEmptyMessageDelayed(0, 3000);//延迟3秒
        }
    };

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

        initViewpager1();
    }


    private void initViewpager1() {
        //找控件
        mViewpager1 = (ViewPager) findViewById(R.id.viewpager1);
        mTvTest = (TextView) findViewById(R.id.tvTest);//显示文本的
        mDot = (LinearLayout) findViewById(R.id.dot);//显示圆点

        //初始化数据
        adlist = new ArrayList<Ad>();
        adlist.add(new Ad(R.mipmap.b, "第一个。。"));
        adlist.add(new Ad(R.mipmap.c, "第二个、、"));
        adlist.add(new Ad(R.mipmap.d, "第三个,,,"));
        adlist.add(new Ad(R.mipmap.e, "第四个...."));

        initDots();//圆点的生成

        //为Viewpager1送数据
        mViewpager1.setAdapter(new MyViewPager());
        int centerValue = adlist.size() / 2; // 求商
        int value = centerValue % adlist.size(); //求余

        mViewpager1.setCurrentItem(centerValue - value);//设置当前的page页

        updateTextAndDot();// 更新文本内容

        //Viewpager加监听--联动的效果
        mViewpager1.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            //滚动时改变--自动轮播
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                updateTextAndDot();
            }

            //选中时改变
            @Override
            public void onPageSelected(int position) {
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        h.sendEmptyMessageDelayed(0, 3000);
    }

    /**
     * 更新文本内容和圆点的状态
     */
    private void updateTextAndDot() {
        int currentPage = mViewpager1.getCurrentItem() % adlist.size();//得到当前的page页--永远有
        mTvTest.setText(adlist.get(currentPage).getText());

        // 改变dot
        for (int i = 0; i < mDot.getChildCount(); i++) {
            mDot.getChildAt(i).setEnabled(i == currentPage);
        }
    }

    /***
     * 有几张图片就会产生几个圆点
     */
    private void initDots() {
        for (int i = 0; i < adlist.size(); i++) {
            View view = new View(this);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(16, 16);//圆点的大小
            if (i != 0) {
                params.leftMargin = 10;//圆点间的距离
            }
            view.setLayoutParams(params);
            view.setBackgroundResource(R.drawable.selector_dot);
            mDot.addView(view);
        }
    }


    /**
     * 为Viewpager1送数据的适配器
     */
    class MyViewPager extends PagerAdapter {

        /**
         * 返回很大的值使得getView中的position不断增大来实现循环
         */
        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        /**
         * true表示无需创建 false表示需要创建
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        /**
         * 设置view 最多3个界面
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Ad ads = adlist.get(position % adlist.size());
            View view = View.inflate(MainActivity.this, R.layout.item_image, null);
            ImageView image = (ImageView) view.findViewById(R.id.image);
            image.setImageResource(ads.getImageId());
            container.addView(view);
            return view;
        }

        /**
         * 销毁page position:当前要销毁第几个page object:当前需要销毁的page
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值