美文网首页
2019-10-30 自定义轮播图

2019-10-30 自定义轮播图

作者: xiaohuage | 来源:发表于2019-10-31 10:27 被阅读0次

构思:

轮播图-生活-高清完整正版视频在线观看-优酷

明确目标:

根据录制的视频,先明确轮播图的实际效果,视频中图片定时切换的控件是实现轮播图的关键,那么根据对控件的了解,我们猜测实现这一实际效果的控件和viewpager十分相似,viewpager是一个可以滑动页面的控件,那么结合我们的实际情况进行对比,发现需要在viewpager已知的功能上实现:1、定时切换图片2、添加图片上的文字和圆点3、可以向左右随意滑动切换图片(viewpager在第一张图片时向右滑动不了)。4、设置图片的点击监听事件。

功能实现:

1、新建一个android项目,默认生成一个MainActivity继承自AppCompatActivity,实现方法onCreate,这一步默认会实现,你会发现默认加载了一个启动布局:activity_main.xml

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

}

2、我们首先开始在activity_main下写布局,需要写viewpager控件、textview控件和Linearlayout三个控件,分别放图片、文字、圆点,根据实际效果分析,他们是层叠的,所以用帧布局,布局代码如下:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="190dp"

    android:orientation="vertical">

<android.support.v4.view.ViewPager

        android:id="@+id/viewpager"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:background="@color/colorAccent" />

<LinearLayout

    android:layout_width="match_parent"

    android:layout_height="25dp"

    android:orientation="horizontal"

    android:layout_gravity="bottom"

    android:gravity="center_vertical"

    android:background="#33000000"

    >

<TextView

        android:id="@+id/textView"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="@string/title"

        android:textColor="#ffffffff"

        android:layout_gravity="left"

        android:layout_marginLeft="10dp"

        />

<LinearLayout

        android:id="@+id/dotView"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal"

        android:gravity="right"

        android:layout_marginRight="30dp"

        />

</LinearLayout>

</FrameLayout>

3、初始化布局控件到MainActivity类中,代码如下:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    viewPager = findViewById(R.id.viewpager);

    dotViews = findViewById(R.id.dotView);

    textView = findViewById(R.id.textView);

}

4、实现viewpager放置图片,手动滑动切换图片,此时第一张图片向右是不可滑动的:

viewPager.setAdapter(new MyAdapter(imageViews));//viewPager是控件;new MyAdapter(imageViews)看成是数据,实际是自定义适配器,里面可以理解为处理图片数据的一个机制,处理好了放viewPager控件上显示图片

5、自定义MyAdapter适配器,理解成:实现图片数据处理机制,自定义MyAdapter适配器代码如下:

public class MyAdapter extends PagerAdapter {

private ArrayList arrayList;

    public MyAdapter(ArrayList arrayList) {

this.arrayList = arrayList;

    }

@Override

    public int getCount() {

//设置可视图数量

        return Integer.MAX_VALUE;

    }

@Override

    public boolean isViewFromObject(View view, Object object) {

return view == object;//object是承载图片的控件imageView,父控件是View

    }

@Override

    public ObjectinstantiateItem(ViewGroup container, int position) {

//给container添加内容~图片

        container.addView(arrayList.get(position %arrayList.size()));

        return arrayList.get(position %arrayList.size());

    }

@Override

    public void destroyItem(ViewGroup container, int position, Object object) {

//  super.destroyItem(container, position, object);

//销毁对应位置上的object

            container.removeView((View) object);

    }

}

6、添加图片资源到一个int数组,R.drawable.timg, R.drawable.timg1, R.drawable.timg2,R.drawable.timg1是res/drawable文件下的图片资源,将数组转成集合传到MyAdapter适配器:

public class MainActivity extends AppCompatActivity {

    private int[]imagers;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

imagers =new int[]{R.drawable.timg, R.drawable.timg1, R.drawable.timg2,R.drawable.timg1};

ArrayList <ImageView >    imageViews =new ArrayList <ImageView > ();

ImageView imageView;

for (int i =0; i<imagers.length;i++){

imageView =new ImageView(MainActivity.this);

    imageView.setBackgroundResource(imagers[i]);

    imageViews.add(imageView);

}

}

}

小结:目前viewpager控件显示图片了,可以滑动切换显示图片了。

下一目标:让图片定时切换

1、onCreate函数下开线程设置定时器,代码如下:

new Thread() {

public void run() {

boolean running =true;

        while (running) {

try {

Thread.sleep(5000);//5S切换下一张图片

            }catch (InterruptedException e) {

e.printStackTrace();

            }

runOnUiThread(new Runnable() {

@Override

                public void run() {

viewPager.setCurrentItem(viewPager.getCurrentItem() +1);//当前图片为下一张图片,即实现了图片的切换

                }

});

        }

}

}.start();

下一目标:实现向右滑动切换功能,代码如下:

// 把ViewPager设置为默认选中Integer.MAX_VALUE / t2,从十几亿次开始轮播图片,达到无限循环目的(那么我们开始看到的第一张图片就是第十几亿次的图片,从而达到向右滑动的目的);

int m = (Integer.MAX_VALUE /2) %imageViews.size();

int currentPosition = Integer.MAX_VALUE /2 - m;

viewPager.setCurrentItem(currentPosition);

下一目标:添加文字:

public class MainActivityextends AppCompatActivity {

private TextView textView;

private String[] textString;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    textView = findViewById(R.id.textView);

textString =new String[]{

"text1", "text2", "text3","text4"

};

textView.setText(textString[0]);//默认设置显示为:text1

//viewpager切换时,文字显示对应也完成切换

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

// Toast.makeText(MainActivity.this,"onPageScrolled",Toast.LENGTH_LONG).show();

    }

@Override

    public void onPageSelected(int position) {

//Toast.makeText(MainActivity.this,"onPageSelected",Toast.LENGTH_LONG).show();

        int currentPage = position %imageViews.size();//记录切换后的当前页的index

        textView.setText(textString[currentPage]);//根据当前页的index取对应的文字显示,完成图片文字的同步显示

    }

@Override

    public void onPageScrollStateChanged(int state) {

//Toast.makeText(MainActivity.this,"onPageScrollStateChanged",Toast.LENGTH_LONG).show();

    }

});

}

}

下一目标:添加圆点:

1、将两种颜色的图片添加到项目,顾名思义,一张是显示的灰色圆点,一张是白色的(选中状态):

2、设置圆形图片切换的状态,选中时为白色,默认为灰色,新建dot.xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/white_dot" android:state_enabled="true"/>

    <item android:drawable="@drawable/gray_dot"  android:state_enabled="false"/>

</selector>

3、实现切换页面时,小圆点切换同步显示:

public class MainActivityextends AppCompatActivity {

private LinearLayout dotViews;

private int defaultPage =0;

@Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

    dotViews = findViewById(R.id.dotView);

//因为图片切换时,圆点对应切换,所以图片的张数决定圆点的个数,将圆点的图片放在for循环下面生成viewpager图片张数的圆点控件View,添加到LinearLayout控件,圆点图片默认为禁止选中状态,为灰色

for (int i =0; i <imagers.length; i++){

    layoutParams =new LinearLayout.LayoutParams(30, 30);//控件大小设置

    dotView =new View(this);//承载显示圆点图片的控件

    dotView.setBackgroundResource(R.drawable.dot);//状态切换

    dotView.setEnabled(false);//禁止选中状态

    dotViews.addView(dotView, layoutParams);//将控件View添加到LinearLayout

}

dotViews.getChildAt(0).setEnabled(true);//显示第一个圆点为选中状态,白色

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

// Toast.makeText(MainActivity.this,"onPageScrolled",Toast.LENGTH_LONG).show();

    }

@Override

    public void onPageSelected(int position) {

//Toast.makeText(MainActivity.this,"onPageSelected",Toast.LENGTH_LONG).show();

//ViewPager切换的过程,比如说:默认第一个圆点是选中状态为白色,对应第一个页面index=0,现在由第一个页面切换到第二个页面index=1,会触发到onPageSelected这个函数,切换的过程要实现如下代码操作

        int currentPage = position %imageViews.size();

//切换后的页面,当前页index

        dotViews.getChildAt(defaultPage).setEnabled(false);

//将index=0的第一个页面的圆点变成未选中状态,灰色

        dotViews.getChildAt(currentPage).setEnabled(true);;

//将index=1的页面的圆点变成选中状态,白色

        defaultPage = currentPage;

//记录index=1的页面为默认页面(第一个页面index=0),为了完成下一页面的切换index=2的页面为下一个切换后的页面(相当于上一个步骤(index为0和1页面的切换)的index=1)

    }

@Override

    public void onPageScrollStateChanged(int state) {

//Toast.makeText(MainActivity.this,"onPageScrollStateChanged",Toast.LENGTH_LONG).show();

    }

});

}

小结:目前完成页面切换后小圆点切换的同步,小圆点选中的状态是白色,其余小圆点都为灰色,一次只有一个小圆点为选中状态显示为白色

下一目标:设置每一张图片的点击监听事件:

具体实现:

1、添加pages.xml文件,目的是为了添加id值:

代码:

<?xml version="1.0" encoding="utf-8"?>

    <item name="pager_img1" type="id"/>

    <item name="pager_img2" type="id"/>

    <item name="pager_img3" type="id"/>

    <item name="pager_img4" type="id"/>

    <item name="pager_img5" type="id"/>

</resources>

2、因为图片显示控件是动态添加的,所以没有对应的控件ID,需要动态添加控件id,并且需要与各个图片一一对应,
public class MainActivityextends AppCompatActivity {

private int[] imagerId;

@Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

imagerId=new int[]{

        R.id.pager_img1,

        R.id.pager_img2,

        R.id.pager_img3,

        R.id.pager_img4,

        R.id.pager_img5

};

ImageView imageView;

for (int i =0; i <imagers.length;i++){

imageView =new ImageView(MainActivity.this);

//图片添加到ImageView 控件已经省略,上面步骤已经实现

    imageView.setId(imagerId[i]);//图片控件和id同步

    imageView.setOnClickListener(new pagerOnClickListener(MainActivity.this));//设置图片点击监听

    imageViews.add(imageView);

}

}

}

3、设置图片点击监听事件类,代码如下,具体业务逻辑在各个case下面写,目前显示的是一个弹窗窗口:

public class pagerOnClickListener implements View.OnClickListener{

Contextm  Context;

    public pagerOnClickListener(Context mContext){

this.mContext=mContext;

    }

@Override

    public void onClick(View v) {

switch (v.getId()) {

case R.id.pager_img1:

Toast.makeText(mContext, "图片1被点击", Toast.LENGTH_SHORT).show();

break;

            case R.id.pager_img2:

Toast.makeText(mContext, "图片2被点击", Toast.LENGTH_SHORT).show();

break;

            case R.id.pager_img3:

Toast.makeText(mContext, "图片3被点击", Toast.LENGTH_SHORT).show();

break;

            case R.id.pager_img4:

Toast.makeText(mContext, "图片4被点击", Toast.LENGTH_SHORT).show();

break;

            case R.id.pager_img5:

Toast.makeText(mContext, "图片5被点击", Toast.LENGTH_SHORT).show();

break;

        }

}

}

总结:目前所有功能都已经实现了,您弄懂了吗?

 

相关文章

网友评论

      本文标题:2019-10-30 自定义轮播图

      本文链接:https://www.haomeiwen.com/subject/eiqavctx.html