Tabhost+framgent+ViewPager滑动效果

了解了一下Tabhost+framgent+ViewPager实现页面滑动的效果

下载地址:https://github.com/asijack/TabhostDemo-framgent-ViewPager

效果如图:

Tabhost+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这个类了

/*

 * 

 * 一、谷歌官方认为,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

 

你可能感兴趣的:(viewpager)