viewpager實現自動滑動以及手勢滑動功能
阿新 • • 發佈:2019-01-23
今天在做專案的時候,有一個viewpgaer展示圖片的頁面,第一反應是去網上查詢,後來看了好多文章,其實也就是那麼兩三篇文章,其他的都是轉載來轉載去的,主要就是運用執行緒來進行無限迴圈進行實現的操作,個人感覺並不需要運用到執行緒,尤其是你寫了死迴圈後,執行緒的回收就是個問題,所以就尋思著自己實現功能好了。
先看效果圖吧:
實現思路:
在專案裡比較重要的兩個東西,一個是handler的使用,一個是監聽viewpager的觸控事件,具體的思路是設定一個bool值來監聽是否觸控viewpager,我們都知道你如果手動滑動,肯定是要觸控的,我們在觸控的時候把isTouch設定為true,這時候我們手動的把handler裡面的訊息全部清除掉,當action_up的時候,我們在重新向handler裡面傳送資訊,在handler中進行自動滑動的操作,自動滑動的時間間隔是3秒,最後程式碼如下:
hanlder類
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
//自動迴圈
if (!isTouch)
{
int item=msg.what;
if (item==2)
{
viewPager.setCurrentItem(item);
item=0 ;
handler.sendEmptyMessageDelayed(item, 3000);
}else
{
viewPager.setCurrentItem(item);
item++;
handler.sendEmptyMessageDelayed(item, 3000);
}
}
}
};
//傳送第一個自動更換的資訊
handler.sendEmptyMessageDelayed(1, 3000);
viewpager的觸控事件
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
//這裡的操作很重要
//從訊息佇列中移除所有message
handler.removeMessages(1);
handler.removeMessages(2);
handler.removeMessages(0);
isTouch = true;
break;
case MotionEvent.ACTION_UP:
isTouch = false;
//重新發送
handler.sendEmptyMessageDelayed(viewPager.getCurrentItem(), 3000);
break;
}
return false;
}
});
//初始化viewpager
private void initViewPager(final View view) {
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
mainPagerAdapter = new MainPagerAdapter(imageList);
viewPager.setAdapter(mainPagerAdapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
dotsView.get(position).setBackgroundResource(R.drawable.blue_circle);
dotsView.get(oldposition).setBackgroundResource(R.drawable.white_circle);
oldposition = position;
currentPostion = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
全部程式碼:
//初始化viewpager
private void initViewPager(final View view) {
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
mainPagerAdapter = new MainPagerAdapter(imageList);
viewPager.setAdapter(mainPagerAdapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
dotsView.get(position).setBackgroundResource(R.drawable.blue_circle);
dotsView.get(oldposition).setBackgroundResource(R.drawable.white_circle);
oldposition = position;
currentPostion = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
//從訊息佇列中移除所有message
handler.removeMessages(1);
handler.removeMessages(2);
handler.removeMessages(0);
isTouch = true;
break;
case MotionEvent.ACTION_UP:
isTouch = false;
//重新發送
handler.sendEmptyMessageDelayed(currentPostion, 3000);
break;
}
return false;
}
});
MainActivity.menu.addIgnoredView(viewPager);
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
//自動迴圈
if (!isTouch)
{
int item=msg.what;
if (item==2)
{
viewPager.setCurrentItem(item);
item=0;
handler.sendEmptyMessageDelayed(item, 3000);
}else
{
viewPager.setCurrentItem(item);
item++;
handler.sendEmptyMessageDelayed(item, 3000);
}
}
}
};
//傳送第一個自動更換的資訊
handler.sendEmptyMessageDelayed(1, 3000);
}