版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!html
記錄viewpager滑動的時候彈出對話框的功能(關鍵功能是滑動彈出對話框後,隱藏對話框的時候當前頁能夠還原到原位置),順便判斷首頁和最後一頁。java
實現滑動後彈出對話框,而後對話框隱藏後當前頁面還原到原位置的功能,關鍵代碼以下:android
/**ViewPage切換的事件監聽 * http://blog.csdn.net/zhengxiaoyao0716/article/details/48805703*/ public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { private boolean isNormalChange = false;//標明是否普通的上翻頁和下翻頁【默認爲false,標明須要判斷而後彈出對話框】 private int resetXPoint = 0;//獲取彈出對話框,還原的scrollTo的X座標值,默認是0.打開的是第幾頁,好比,若是是第二頁,那麼第二頁的X座標是0 + (2-1)*viwepager的寬度 /* 這個方法在手指操做屏幕的時候發生變化。有三個值:0(END),1(PRESS) , 2(UP) 。 * arg0 ==1的時辰默示正在滑動,arg0==2的時辰默示滑動完畢了,arg0==0的時辰默示什麼都沒作。 */ @Override public void onPageScrollStateChanged(int state) { if(state == 1){ isNormalChange = false; } } /* 用戶一次滑動,這個方法會持續調用N屢次,直至某個View充滿視圖而且穩定住!(但具體調用次數也不肯定,尤爲在首末位置向邊界滑動,若是Log一下,會看到出現調用不肯定次數的打印,且positionOffset都爲0. * position 當前頁面,及你點擊滑動的頁面【position爲當前屏幕上所露出的全部View的Item取下限。好比,當前Item爲3,輕輕向右滑動一下,2露出了一點點,那麼position就是2;而若是向左滑動,露出的4比3大,那麼只要3沒徹底隱匿,那麼position就一直按照3算。】 * positionOffset 當前頁面偏移的百分比【positionOffset是當前Item較大的那個View佔視圖的百分比,0-1,沒有負數!當滑動結束時,onPageScrolled();最後一次調用,positionOffset爲0。】 * positionOffsetPixels 當前頁面偏移的像素位置 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //這裏獲取第一個值,用來判斷是左滑仍是右滑(若是viewpager的寬度 - positionOffsetPixels <= viewpager的寬度的一半,則表明往左滑動(上一頁),反之右滑(下一頁)) /*int positionOffsetPixelsTemp = - positionOffsetPixels;//獲取須要偏移的數值(默認獲取的是往右滑(下一頁)的狀況下的偏移值) int viewPagerWidth = mViewPager.getWidth(); if(viewPagerWidth - positionOffsetPixels <= viewPagerWidth / 2){ positionOffsetPixelsTemp = viewPagerWidth - positionOffsetPixels; }*/ /* * 當第一頁上翻頁時:position = 0;currentItemIndex=0;positionOffset=0.0;positionOffsetPixels=0 * 普通上翻頁時:position = 0;currentItemIndex=1-->0;positionOffset==0.99224806-->0.0;positionOffsetPixels=1024-->0 * 當最後一頁下翻頁時:position = 10;currentItemIndex=10;positionOffset=0.0;positionOffsetPixels=0 * 普通下翻頁時:position = 9;currentItemIndex=9-->10;positionOffset=0.041666985-->0.9-->0.0;positionOffsetPixels=43-->1024-->0 * */ if(! isNormalChange){ if(position == mPictureBeanList.size() - 1 && position ==currentItemIndex && positionOffset == 0.0 && positionOffsetPixels == 0){ //在最後一頁進行滑動 }else if(position == 0 && position ==currentItemIndex && positionOffset == 0.0 && positionOffsetPixels == 0){ //在第一頁進行滑動 }else { //判斷是否數據(例如,標題)發生了改變,若是發生了改變,那麼彈出對話框 PictureBean picBean = mPictureBeanList.get(currentItemIndex); String oldPicTitle = picBean.getPicTitle();//舊的圖片標題 String newPicTitle = mPicTitleEdt.getText().toString();//新的圖片標題 boolean changed = newPicTitle.equals(oldPicTitle); if (changed) { isNormalChange = true;//【若是數據沒有發生改變,則表明是正常滑動】 }else{ mViewPager.setIsCanScroll(false);//禁止滑動 //彈出提示對話框 // 建立構建器 AlertDialog.Builder builder = new AlertDialog.Builder(mContext); // 設置參數 builder.setTitle("提示") .setMessage("標題發生了改變,是否保存?") .setPositiveButton("保存", new DialogInterface.OnClickListener() {// 積極 @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub mViewPager.setIsCanScroll(true);//容許滑動 mViewPager.scrollTo(resetXPoint,0); uploadImgTitle(); } }).setNegativeButton("不保存", new DialogInterface.OnClickListener() {// 消極 @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub mViewPager.setIsCanScroll(true);//容許滑動 mViewPager.scrollTo(resetXPoint,0); //還原標題 PictureBean pictureBean = mPictureBeanList.get(currentItemIndex); mPicTitleEdt.setText(pictureBean.getPicTitle()); } }).setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInterface) { mViewPager.setIsCanScroll(true);//容許滑動 mViewPager.scrollTo(resetXPoint,0); } }); builder.create().show(); } } } } /* 這個方法有一個參數position,表明哪一個頁面被選中。 * 當用手指滑動翻頁的時候,若是翻動成功了(滑動的距離夠長),手指擡起來就會當即執行這個方法 * position就是當前滑動到的頁面。 * 若是直接setCurrentItem翻頁,那position就和setCurrentItem的參數一致,這種狀況在onPageScrolled執行方法前就會當即執行。 */ @Override public void onPageSelected(int position) { Log.w("why", "{MyOnPageChangeListener}{onPageSelected}position="+position); Log.w("why", "{MyOnPageChangeListener}{onPageSelected}currentItemIndex="+currentItemIndex); resetXPoint = resetXPoint + (position - currentItemIndex) * mViewPager.getWidth(); currentItemIndex = position; showPageNum();//設置頁碼 } }
注意事項:git
一、 導入類文件後須要change包名以及從新import R文件路徑github
二、 Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋app
一、將MyCustomViewPager複製到項目中框架
package com.why.project.viewpagerwithimagedemo.viewpager; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * Created by HaiyuKing * Used 自定義的viewpager * https://www.cnblogs.com/tangs/articles/5933233.html * 解決切換須要通過中間頁的問題; * 實現控制viewpager是否可滑動; * 解決視頻播放器和viewpager滑動衝突問題【可擴展到任何view】; */ public class MyCustomViewPager extends ViewPager { /**是否能夠滑動:默承認以滑動*/ private boolean isCanScroll = true; public MyCustomViewPager(Context context) { super(context); } public MyCustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); } /** * 解決切換須要通過中間頁 */ @Override public void setCurrentItem(int item) { //super.setCurrentItem(item);源碼 super.setCurrentItem(item,false);//smoothScroll false表示切換的時候,不通過兩個頁面的中間頁 } /** * 讓ViewPager不能左右滑動 */ @Override public boolean onTouchEvent(MotionEvent ev) { if(isCanScroll){ return super.onTouchEvent(ev); }else{ return false; } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if(isCanScroll){ return super.onInterceptTouchEvent(ev); }else{ return false; } } /** * 暴露出去的方法,屏蔽ViewPager的滑動,默認不可滑動 * @param isCanScroll 爲true能夠左右滑動,爲false不可滑動 */ public void setIsCanScroll(boolean isCanScroll){ this.isCanScroll = isCanScroll; } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { /*if (v instanceof IjkVideoView) {//解決視頻播放器和viewpager滑動衝突問題 return true; }*/ return super.canScroll(v, checkV, dx, x, y); } }
二、在activity佈局文件中引用MyCustomViewPager【注意,MyCustomViewPager的完整路徑須要根據實際狀況修改】ide
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="8dp"> <!-- viewpager區域 --> <com.why.project.viewpagerwithimagedemo.viewpager.MyCustomViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="0.0dp" android:layout_weight="1" android:clipChildren="false" android:background="#ffffff" android:layout_marginBottom="8dp"/> <EditText android:id="@+id/edt_title" android:layout_width="match_parent" android:layout_height="48dp"/> <TextView android:id="@+id/tv_page" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:layout_gravity="center"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/img_pic" android:layout_width="match_parent" android:layout_height="wrap_content" android:contentDescription="@string/app_name" android:gravity="center" android:src="@drawable/img_default" android:scaleType="fitCenter" android:background="#343434" />
package com.why.project.viewpagerwithimagedemo.bean; /** * Created by HaiyuKing * Used */ public class PictureBean { //圖片ID值 private String picId = ""; //圖片的res id值【這裏模擬的是圖片的url地址,因此使用的res id值進行代替】 private int picResId = 0; //圖片標題 private String picTitle = ""; public String getPicId() { return picId; } public void setPicId(String picId) { this.picId = picId; } public int getPicResId() { return picResId; } public void setPicResId(int picResId) { this.picResId = picResId; } public String getPicTitle() { return picTitle; } public void setPicTitle(String picTitle) { this.picTitle = picTitle; } }
將演示用的圖片資源複製到項目中佈局
五、在activity中初始化viewpager並關聯佈局文件和集合數據【這只是一個基礎的框架,後續還須要繼續完善】ui
package com.why.project.viewpagerwithimagedemo; import android.content.Context; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import com.why.project.viewpagerwithimagedemo.bean.PictureBean; import com.why.project.viewpagerwithimagedemo.viewpager.MyCustomViewPager; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private Context mContext; private EditText mPicTitleEdt; private TextView mPageTv; /**中間viewpager區域*/ private MyCustomViewPager mViewPager; /**ViewPager適配器*/ private MyViewPagerAdapter mViewPageAdapter; //viewpager的數據集合 private ArrayList<PictureBean> mPictureBeanList; /**viewpager中當前頁面的下標值*/ private int currentItemIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; //初始化控件以及設置 initView(); //初始化數據 initData(); //初始化控件的點擊事件 initEvent(); } @Override public void onDestroy() { mViewPager.removeAllViews();//防止內存泄漏 System.gc();//回收 super.onDestroy(); } private void initView() { mPicTitleEdt = findViewById(R.id.edt_title); mPageTv = findViewById(R.id.tv_page); mViewPager = (MyCustomViewPager) findViewById(R.id.view_pager); mViewPager.setOffscreenPageLimit(3);//設置預加載的頁數,以前是3【這個值指的是,當前view的左右兩邊的預加載的頁面的個數。也就是說,若是這個值mOffscreenPageLimit = 3,那麼任何一個頁面的左邊能夠預加載3個頁面,右邊也能夠加載3頁面。】 } private void initData() { //初始化數據 mPictureBeanList = new ArrayList<PictureBean>(); PictureBean bean0 = new PictureBean(); bean0.setPicId("pic0"); bean0.setPicTitle("圖片1"); bean0.setPicResId(R.drawable.pic_0); mPictureBeanList.add(bean0); // PictureBean bean1 = new PictureBean(); bean1.setPicId("pic1"); bean1.setPicTitle("圖片2"); bean1.setPicResId(R.drawable.pic_1); mPictureBeanList.add(bean1); // PictureBean bean2 = new PictureBean(); bean2.setPicId("pic0"); bean2.setPicTitle("圖片3"); bean2.setPicResId(R.drawable.pic_2); mPictureBeanList.add(bean2); // PictureBean bean3 = new PictureBean(); bean3.setPicId("pic3"); bean3.setPicTitle("圖片4"); bean3.setPicResId(R.drawable.pic_3); mPictureBeanList.add(bean3); //設置頁碼 if(mPictureBeanList.size() > 0){ showPageNum(); } //填充viewpager數據 initViewPage(); } private void initEvent() { } //設置頁碼和標題輸入框 private void showPageNum() { mPageTv.setText((currentItemIndex+1) + "/" + mPictureBeanList.size()); String picTitle = mPictureBeanList.get(currentItemIndex).getPicTitle(); mPicTitleEdt.setText(picTitle); } /**初始化viewpager配置*/ private void initViewPage(){ if(mViewPageAdapter == null){ mViewPageAdapter = new MyViewPagerAdapter(); mViewPager.setAdapter(mViewPageAdapter); mViewPager.addOnPageChangeListener(new MyOnPageChangeListener());//設置頁面切換監聽事件 mViewPager.setIsCanScroll(true);//容許滑動 }else{ mViewPageAdapter.notifyDataSetChanged(); } mViewPager.setCurrentItem(currentItemIndex); } /**ViewPager適配器*/ public class MyViewPagerAdapter extends PagerAdapter { /**這個方法,是從ViewGroup中移出當前View*/ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(((View)object)); } /**這個方法,是獲取viewpager的界面數*/ @Override public int getCount() { return mPictureBeanList.size(); } public int getItemPosition(Object object) { return POSITION_NONE;//-2 } /**這個方法,return一個對象,這個對象代表了PagerAdapter將選擇將這個對象填充到在當前ViewPager裏*/ @Override public Object instantiateItem(ViewGroup container, int position){ View layout = LayoutInflater.from(mContext).inflate(R.layout.view_pager_layout, null);//將佈局文件view添加到viewpager中 container.addView((View)layout); ImageView mPicImgView = layout.findViewById(R.id.img_pic); mPicImgView.setImageResource(mPictureBeanList.get(position).getPicResId()); return layout; } /**這個方法,在幫助文檔中原文是could be implemented as return view == object,也就是用於判斷是否由對象生成界面*/ @Override public boolean isViewFromObject(View view, Object object) { // TODO Auto-generated method stub return view == object ? true : false;//官方提示這樣寫 } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); } } /**ViewPage切換的事件監聽 * http://blog.csdn.net/zhengxiaoyao0716/article/details/48805703*/ public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { /* 這個方法在手指操做屏幕的時候發生變化。有三個值:0(END),1(PRESS) , 2(UP) 。 * arg0 ==1的時辰默示正在滑動,arg0==2的時辰默示滑動完畢了,arg0==0的時辰默示什麼都沒作。 */ @Override public void onPageScrollStateChanged(int state) { } /* 用戶一次滑動,這個方法會持續調用N屢次,直至某個View充滿視圖而且穩定住!(但具體調用次數也不肯定,尤爲在首末位置向邊界滑動,若是Log一下,會看到出現調用不肯定次數的打印,且positionOffset都爲0. * position 當前頁面,及你點擊滑動的頁面【position爲當前屏幕上所露出的全部View的Item取下限。好比,當前Item爲3,輕輕向右滑動一下,2露出了一點點,那麼position就是2;而若是向左滑動,露出的4比3大,那麼只要3沒徹底隱匿,那麼position就一直按照3算。】 * positionOffset 當前頁面偏移的百分比【positionOffset是當前Item較大的那個View佔視圖的百分比,0-1,沒有負數!當滑動結束時,onPageScrolled();最後一次調用,positionOffset爲0。】 * positionOffsetPixels 當前頁面偏移的像素位置 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /* 這個方法有一個參數position,表明哪一個頁面被選中。 * 當用手指滑動翻頁的時候,若是翻動成功了(滑動的距離夠長),手指擡起來就會當即執行這個方法 * position就是當前滑動到的頁面。 * 若是直接setCurrentItem翻頁,那position就和setCurrentItem的參數一致,這種狀況在onPageScrolled執行方法前就會當即執行。 */ @Override public void onPageSelected(int position) { currentItemIndex = position; showPageNum();//設置頁碼 } } }
package com.why.project.viewpagerwithimagedemo; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import com.why.project.viewpagerwithimagedemo.bean.PictureBean; import com.why.project.viewpagerwithimagedemo.viewpager.MyCustomViewPager; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private Context mContext; private EditText mPicTitleEdt; private TextView mPageTv; /**中間viewpager區域*/ private MyCustomViewPager mViewPager; /**ViewPager適配器*/ private MyViewPagerAdapter mViewPageAdapter; //viewpager的數據集合 private ArrayList<PictureBean> mPictureBeanList; /**viewpager中當前頁面的下標值*/ private int currentItemIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; //初始化控件以及設置 initView(); //初始化數據 initData(); //初始化控件的點擊事件 initEvent(); } @Override public void onDestroy() { mViewPager.removeAllViews();//防止內存泄漏 System.gc();//回收 super.onDestroy(); } private void initView() { mPicTitleEdt = findViewById(R.id.edt_title); mPageTv = findViewById(R.id.tv_page); mViewPager = (MyCustomViewPager) findViewById(R.id.view_pager); mViewPager.setOffscreenPageLimit(3);//設置預加載的頁數,以前是3【這個值指的是,當前view的左右兩邊的預加載的頁面的個數。也就是說,若是這個值mOffscreenPageLimit = 3,那麼任何一個頁面的左邊能夠預加載3個頁面,右邊也能夠加載3頁面。】 } private void initData() { //初始化數據 mPictureBeanList = new ArrayList<PictureBean>(); PictureBean bean0 = new PictureBean(); bean0.setPicId("pic0"); bean0.setPicTitle("圖片1"); bean0.setPicResId(R.drawable.pic_0); mPictureBeanList.add(bean0); // PictureBean bean1 = new PictureBean(); bean1.setPicId("pic1"); bean1.setPicTitle("圖片2"); bean1.setPicResId(R.drawable.pic_1); mPictureBeanList.add(bean1); // PictureBean bean2 = new PictureBean(); bean2.setPicId("pic0"); bean2.setPicTitle("圖片3"); bean2.setPicResId(R.drawable.pic_2); mPictureBeanList.add(bean2); // PictureBean bean3 = new PictureBean(); bean3.setPicId("pic3"); bean3.setPicTitle("圖片4"); bean3.setPicResId(R.drawable.pic_3); mPictureBeanList.add(bean3); //設置頁碼 if(mPictureBeanList.size() > 0){ showPageNum(); } //填充viewpager數據 initViewPage(); } private void initEvent() { } //設置頁碼和標題輸入框 private void showPageNum() { mPageTv.setText((currentItemIndex+1) + "/" + mPictureBeanList.size()); String picTitle = mPictureBeanList.get(currentItemIndex).getPicTitle(); mPicTitleEdt.setText(picTitle); } /**初始化viewpager配置*/ private void initViewPage(){ if(mViewPageAdapter == null){ mViewPageAdapter = new MyViewPagerAdapter(); mViewPager.setAdapter(mViewPageAdapter); mViewPager.addOnPageChangeListener(new MyOnPageChangeListener());//設置頁面切換監聽事件 mViewPager.setIsCanScroll(true);//容許滑動 }else{ mViewPageAdapter.notifyDataSetChanged(); } mViewPager.setCurrentItem(currentItemIndex); } /**ViewPager適配器*/ public class MyViewPagerAdapter extends PagerAdapter { /**這個方法,是從ViewGroup中移出當前View*/ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(((View)object)); } /**這個方法,是獲取viewpager的界面數*/ @Override public int getCount() { return mPictureBeanList.size(); } public int getItemPosition(Object object) { return POSITION_NONE;//-2 } /**這個方法,return一個對象,這個對象代表了PagerAdapter將選擇將這個對象填充到在當前ViewPager裏*/ @Override public Object instantiateItem(ViewGroup container, int position){ View layout = LayoutInflater.from(mContext).inflate(R.layout.view_pager_layout, null);//將佈局文件view添加到viewpager中 container.addView((View)layout); ImageView mPicImgView = layout.findViewById(R.id.img_pic); mPicImgView.setImageResource(mPictureBeanList.get(position).getPicResId()); return layout; } /**這個方法,在幫助文檔中原文是could be implemented as return view == object,也就是用於判斷是否由對象生成界面*/ @Override public boolean isViewFromObject(View view, Object object) { // TODO Auto-generated method stub return view == object ? true : false;//官方提示這樣寫 } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); } } /**ViewPage切換的事件監聽 * http://blog.csdn.net/zhengxiaoyao0716/article/details/48805703*/ public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { private boolean isNormalChange = false;//標明是否普通的上翻頁和下翻頁【默認爲false,標明須要判斷而後彈出對話框】 private int resetXPoint = 0;//獲取彈出對話框,還原的scrollTo的X座標值,默認是0.打開的是第幾頁,好比,若是是第二頁,那麼第二頁的X座標是0 + (2-1)*viwepager的寬度 /* 這個方法在手指操做屏幕的時候發生變化。有三個值:0(END),1(PRESS) , 2(UP) 。 * arg0 ==1的時辰默示正在滑動,arg0==2的時辰默示滑動完畢了,arg0==0的時辰默示什麼都沒作。 */ @Override public void onPageScrollStateChanged(int state) { if(state == 1){ isNormalChange = false; } } /* 用戶一次滑動,這個方法會持續調用N屢次,直至某個View充滿視圖而且穩定住!(但具體調用次數也不肯定,尤爲在首末位置向邊界滑動,若是Log一下,會看到出現調用不肯定次數的打印,且positionOffset都爲0. * position 當前頁面,及你點擊滑動的頁面【position爲當前屏幕上所露出的全部View的Item取下限。好比,當前Item爲3,輕輕向右滑動一下,2露出了一點點,那麼position就是2;而若是向左滑動,露出的4比3大,那麼只要3沒徹底隱匿,那麼position就一直按照3算。】 * positionOffset 當前頁面偏移的百分比【positionOffset是當前Item較大的那個View佔視圖的百分比,0-1,沒有負數!當滑動結束時,onPageScrolled();最後一次調用,positionOffset爲0。】 * positionOffsetPixels 當前頁面偏移的像素位置 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //這裏獲取第一個值,用來判斷是左滑仍是右滑(若是viewpager的寬度 - positionOffsetPixels <= viewpager的寬度的一半,則表明往左滑動(上一頁),反之右滑(下一頁)) /*int positionOffsetPixelsTemp = - positionOffsetPixels;//獲取須要偏移的數值(默認獲取的是往右滑(下一頁)的狀況下的偏移值) int viewPagerWidth = mViewPager.getWidth(); if(viewPagerWidth - positionOffsetPixels <= viewPagerWidth / 2){ positionOffsetPixelsTemp = viewPagerWidth - positionOffsetPixels; }*/ /* * 當第一頁上翻頁時:position = 0;currentItemIndex=0;positionOffset=0.0;positionOffsetPixels=0 * 普通上翻頁時:position = 0;currentItemIndex=1-->0;positionOffset==0.99224806-->0.0;positionOffsetPixels=1024-->0 * 當最後一頁下翻頁時:position = 10;currentItemIndex=10;positionOffset=0.0;positionOffsetPixels=0 * 普通下翻頁時:position = 9;currentItemIndex=9-->10;positionOffset=0.041666985-->0.9-->0.0;positionOffsetPixels=43-->1024-->0 * */ if(! isNormalChange){ if(position == mPictureBeanList.size() - 1 && position ==currentItemIndex && positionOffset == 0.0 && positionOffsetPixels == 0){ //在最後一頁進行滑動 }else if(position == 0 && position ==currentItemIndex && positionOffset == 0.0 && positionOffsetPixels == 0){ //在第一頁進行滑動 }else { //判斷是否數據(例如,標題)發生了改變,若是發生了改變,那麼彈出對話框 PictureBean picBean = mPictureBeanList.get(currentItemIndex); String oldPicTitle = picBean.getPicTitle();//舊的圖片標題 String newPicTitle = mPicTitleEdt.getText().toString();//新的圖片標題 boolean changed = newPicTitle.equals(oldPicTitle); if (changed) { isNormalChange = true;//【若是數據沒有發生改變,則表明是正常滑動】 }else{ mViewPager.setIsCanScroll(false);//禁止滑動 //彈出提示對話框 // 建立構建器 AlertDialog.Builder builder = new AlertDialog.Builder(mContext); // 設置參數 builder.setTitle("提示") .setMessage("標題發生了改變,是否保存?") .setPositiveButton("保存", new DialogInterface.OnClickListener() {// 積極 @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub mViewPager.setIsCanScroll(true);//容許滑動 mViewPager.scrollTo(resetXPoint,0); uploadImgTitle(); } }).setNegativeButton("不保存", new DialogInterface.OnClickListener() {// 消極 @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub mViewPager.setIsCanScroll(true);//容許滑動 mViewPager.scrollTo(resetXPoint,0); //還原標題 PictureBean pictureBean = mPictureBeanList.get(currentItemIndex); mPicTitleEdt.setText(pictureBean.getPicTitle()); } }).setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInterface) { mViewPager.setIsCanScroll(true);//容許滑動 mViewPager.scrollTo(resetXPoint,0); } }); builder.create().show(); } } } } /* 這個方法有一個參數position,表明哪一個頁面被選中。 * 當用手指滑動翻頁的時候,若是翻動成功了(滑動的距離夠長),手指擡起來就會當即執行這個方法 * position就是當前滑動到的頁面。 * 若是直接setCurrentItem翻頁,那position就和setCurrentItem的參數一致,這種狀況在onPageScrolled執行方法前就會當即執行。 */ @Override public void onPageSelected(int position) { Log.w("why", "{MyOnPageChangeListener}{onPageSelected}position="+position); Log.w("why", "{MyOnPageChangeListener}{onPageSelected}currentItemIndex="+currentItemIndex); resetXPoint = resetXPoint + (position - currentItemIndex) * mViewPager.getWidth(); currentItemIndex = position; showPageNum();//設置頁碼 } } //更新圖片標題 private void uploadImgTitle(){ PictureBean picBean = mPictureBeanList.get(currentItemIndex); picBean.setPicTitle(mPicTitleEdt.getText().toString()); } }
無
暫時空缺