广告轮播实现(ViewPager的实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ye1714505125/article/details/50975773

因博客文章为自己菜鸟学习文章,没有什么功底,都是给自己浏览的,大神就误入了,详情见代码注释 ;

1、开源架包无法关联源代码的两种解决方式,建议选择第二种简单点:

        1、点击 Android Dependencies, 将其在BuildPath  remove 掉,再右击点击jar包,将jar  add to BuildPath ,然后出现  Attatch 按钮,打开对话框,选择External Folder,打开SDK根目录,extras ,android,support,V4 ,src 点击确定;

       2、在Libs目录下创建一个文件夹,文件名是架包的全名,包括后缀.jar ,记得是全名,然后该文件名以加.properties 结尾,打开文件 会显示 src="" , 依次打开SDK根目录,extras ->android->support->V4 ->src   的路径拷贝进去 ,最后它会提示您要不要将“/”  改为 “//” ,点击修改,手动修改也可以,但是一定记得改;

2、 异常,导入的类明明有,但运行的时候,显示类异常,报 class not found异常,解决方案  ,右击 开源架包,选择Build path ,点击 Order  And Export ,将对应的jar包勾选即可;

3、设置单行引号 ,用ellipsize ;

4、ViewPager的实现:

         1.在布局文件中加入控件viewpager,这个组件,注意这个组件是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的
        2.加载要显示的页卡
           3. 
viewpager组件设定一个page适配器,它是基类提供适配器来填充页面ViewPager内部,你很可能想要使用一个更具体的实现,如                                                     FragmentPagerAdapter                  FragmentStatePagerAdapter。
                        4.给viewpager添加OnPageChangeListener事件来实现切换的动画等功能(这一步不是必须的)


界面布局:主界面ContentLayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">
   <!--ViewPager是导入外部的类,所以在引用的时候,要将路径全添加进去-->
    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/ViewPager"
        ></android.support.v4.view.ViewPager>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#AA000000"
        android:layout_alignBottom="@id/ViewPager">
        <TextView
            android:id="@+id/tv_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:ellipsize="end"
            android:text="我是文本"
            android:textColor="#ffffff"
            android:textSize="16sp"
            android:layout_gravity="center_horizontal"/>
        <LinearLayout
             android:layout_marginTop="3dp"
            android:id="@+id/doc_Linearlayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_horizontal" ></LinearLayout>

    </LinearLayout>
    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@android:style/Widget.ProgressBar.Large"
        android:visibility="invisible"
        android:layout_centerInParent="true"/>

</RelativeLayout>
文本框下的两个点布局定义drawable文件夹内:

黑色圆点dots_unfocus

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color="#ffffff"/>
</shape>
白色圆点dots_focus
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
     <solid android:color="#AA000000"/>
</shape>
selector 定义,获取到焦点,显示哪张图片,未获取焦点显示哪张图片 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_enabled="true" android:drawable="@drawable/dot_focus"/>
    <item android:drawable="@drawable/unfocus_docs"/>
</selector>
主代码:

    

public class MainActivity extends AppCompatActivity {
     android.os.Handler handler=new android.os.Handler(){
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what){
                 case 1:
                     viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                     handler.sendEmptyMessageDelayed(1, 4000);
                     break;
                 default:
                     break;
             }
         }
     };
    private  ViewPager viewPager;
    private ImageView imageView;
    private ArrayList<Adbean>  arrayList;
    private TextView textView;
    private  LinearLayout docLayout;
    private  ProgressBar progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        initData();
        initListener();
        updateTextAndDocs();
    }
    private void initView() {
        setContentView(R.layout.activity_main);
        viewPager= (ViewPager) findViewById(R.id.ViewPager);
        textView= (TextView) findViewById(R.id.tv_text);
        docLayout= (LinearLayout) findViewById(R.id.doc_Linearlayout);
    }
    private void initData() {
        viewPager.setAdapter(new MyPagerApdater());
        arrayList=new ArrayList<Adbean>();
        arrayList.add(new Adbean(R.drawable.a,"巩俐不低俗,我就不能低俗"));
        arrayList.add(new Adbean(R.drawable.b,"朴树又回来了,再唱经典老歌,引万人同唱"));
        arrayList.add(new Adbean(R.drawable.c, "歼灭北京电影"));
        arrayList.add(new Adbean(R.drawable.d, "乐视网TV版大放送"));
        arrayList.add(new Adbean(R.drawable.e, "热血屌丝的反杀"));
        //在初始化数据之后再初始化点集
        initDocs();
        int currentValue=Integer.MAX_VALUE/2;
        //取出余数
        int value=currentValue%arrayList.size();
        //设置显示的动画的position位置为最大值的中间,但是将其设置为刚好为 arrayListSize整除,这样才能使得刚开始的位置为0
        viewPager.setCurrentItem(currentValue-value);
        progressBar= (ProgressBar) findViewById(R.id.progressBar);
        handler.sendEmptyMessageDelayed(1,4000);
    }
    private void initListener() {
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                updateTextAndDocs();
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }
    //更新文本
    private void updateTextAndDocs() {
        //获取当前页面的下标
        int currentPage=viewPager.getCurrentItem()%arrayList.size();
        //设置当前页的文本
        textView.setText(arrayList.get(currentPage).getIntros());
        //设置当前页的下方是显示黑点还是白点,如果和页面的下标一致则显示 白点,其它黑点
        for (int i=0;i<docLayout.getChildCount();i++){
            docLayout.getChildAt(i).setEnabled(i == currentPage);
        }
    }
    private  void initDocs(){
        for(int i=0;i<arrayList.size();i++){
            View view=new View(this);
            //使用布局参数设置View的宽高,和间距
            LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(8,8);
            view.setLayoutParams(params);
            if(i!=0){
                params.leftMargin=8;
            }
            view.setBackgroundResource(R.drawable.selector);
            docLayout.addView(view);
        }
    }
    class  MyPagerApdater extends PagerAdapter implements View.OnClickListener{
        @Override
        /**
         返回多少个Page
         */
        public int getCount() {
            return Integer.MAX_VALUE;
        }
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view==object;
        }
        /*
        类似于BaseAdapter的getView
        由于它只需要三个界面,无需ViewHolder
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view=View.inflate(getApplicationContext(), R.layout.image_ad, null);
            imageView= (ImageView) view.findViewById(R.id.iv_image);
            Adbean a=arrayList.get(position%arrayList.size());
            imageView.setImageResource(a.getImages());
            container.addView(view);
            view.setOnClickListener(MyPagerApdater.this);
            updateTextAndDocs();
            return view;
        }
        @Override
        /*
        销毁page
        position:当前需要销毁第几个page
        object: 当亲需要销毁的page
         */
        public void destroyItem(ViewGroup container, int position, Object object) {
            //super.destroyItem(container, position, object);---此方法如果不定义,那么返回的将是一个异常
            container.removeView((View) object);
        }
        //给page设置一个监听器
        @Override
        public void onClick(View v) {


           Toast toast= Toast.makeText(getApplicationContext(), "数据正在加载,请稍后...", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER,0,0);
            toast.show();
            progressBar.setVisibility(ProgressBar.VISIBLE);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/ye1714505125/article/details/50975773