Tabhost+framgent+ViewPager滑動效果,tabhostframgent
瞭解了一下Tabhost+framgent+ViewPager實現頁面滑動的效果
:https://github.com/asijack/TabhostDemo-framgent-ViewPager
效果
需要注意一下幾點:
1、位移量的計算:
//初始化圖片的位移像素 public void InitImage(){ image=(ImageView) findViewById(R.id.cursor); //只有載入了Bitmap對象的時候才能對圖片進行查看修改,decodeResource擷取了Bitmap對象 bmpW=BitmapFactory.decodeResource(getResources(), R.drawable.cours).getWidth();// Android 可設定為隨著視窗大小調整縮放比例,但即便如此,手機程式設計人員還是必須知道手機螢幕的邊界,以避免縮放造成的布局變形問題。// 手機的解析度資訊是手機的一項重要訊息,很好的是,Android 已經提供DisplayMetircs 類可以很方便的擷取解析度。// getWindowManager().getDefaultDisplay().getMetrics;// 建構函式DisplayMetrics 不需要傳遞任何參數;調用getWindowManager() 之後,會取得現有Activity 的Handle // 此時,getDefaultDisplay() 方法將取得的寬高維度存放於DisplayMetrics 對象中,而取得的寬高維度是以像素為單位(Pixel) // “像素”所指的是“絕對像素”而非“相對像素”。 DisplayMetrics dm=new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); //擷取裝置的寬度 int screenW=dm.widthPixels; offset=(screenW/4 -bmpW)/2;//4個item的位移量// offset = (screenW-2*bmpW)/4;//2 個item 的位移量 //imageView設定平移,使底線平移到初始位置(平移一個offset) Matrix matrix=new Matrix(); // Matrix的操作,總共分為translate(平移),rotate(旋轉),scale(縮放)和skew(傾斜)四種 //每一種變換在Android的API裡都提供了set, post和pre三種操作方式,除了translate,其他三種操作都可以指定中心點。 // set是直接設定Matrix的值,每次set一次,整個Matrix的數組都會變掉。 //post是後乘,當前的矩陣乘以參數給出的矩陣。可以連續多次使用post,來完成所需的整個變換。 matrix.postTranslate(offset, 0); image.setImageMatrix(matrix); }
2、滑動動畫的實現
//view頁面滑動的監聽 public class MyOnPageChanceListener implements OnPageChangeListener{ //此方法是在狀態改變的時候調用,arg0參數 有三種狀態0,1,2 ==1時表示正在滑動,==2時表示滑動完畢,==0時表示什麼都沒做 //當頁面開始滑動的時候,三種狀態的變化順序為(1,2,0) @Override public void onPageScrollStateChanged(int arg0) { } //當頁面滑動的時候會調用此方法,在滑動停止之前,此方法會一直得到調用 //arg0 當前頁面,及你點擊滑動的頁面 arg1 當前頁面便宜的百分比 arg2 當前頁面位移的像素位置 @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } //此方法是頁面跳轉完後 得到調用 arg0 是你當前選中的頁面的position(位置編號) @Override public void onPageSelected(int arg0) { int one=offset*2+bmpW;//兩個相鄰頁面的位移量 Animation animation=new TranslateAnimation(currIndex*one, arg0*one,0,0);//平移動畫 currIndex=arg0; animation.setFillAfter(true);//動畫中止時停留在最後一幀,不然會回到沒有執行前的狀態 animation.setDuration(200);//動畫期間0.2秒 image.startAnimation(animation); int i=currIndex +1; Toast.makeText(MainActivity.this, "您選擇了第"+i+"個頁卡", Toast.LENGTH_SHORT).show(); } }
有興趣的朋友可以在這裡實現自己想要的動畫效果
3、最後一個就是MyFragmentPagerAdapter這個類了
/* * * 一、Google官方認為,ViewPager應該和Fragment一起使用時,此時ViewPager的適配器是FragmentPagerAdapter * 當你實現一個FragmentPagerAdapter,你必須至少覆蓋以下方法: getCount() getItem() 二、 如果ViewPager沒有和Fragment一起,ViewPager的適配器是PagerAdapter, 它是基類提供適配器來填充頁面ViewPager內部,當你實現一個PagerAdapter,你必須至少覆蓋以下方法: instantiateItem(ViewGroup, int) destroyItem(ViewGroup, int, Object) getCount() isViewFromObject(View, Object) */public class MyFragmentPagerAdapter extends FragmentPagerAdapter { ArrayList<Fragment> list; public MyFragmentPagerAdapter(FragmentManager fm,ArrayList<Fragment> list) { super(fm); this.list=list; } @Override public Fragment getItem(int arg0) { return list.get(arg0); } @Override public int getCount() { return list.size(); } }
但是這個不是我想要的效果,後面會貼出我自己想要的效果的demo出來。
哪裡有問題歡迎指教,3q
:
https://github.com/asijack/TabhostDemo-framgent-ViewPager