Android ViewPager多页面滑动切换以及动画效果

viewpage实现多页面滑动是通过pageAdapter或FragmentPagerAdapter来实现页面的滑动切换

有的需要类似图片的三角形的滑动动画三角形是更具页面滑动而滑动的并且指定在相应的选项卡下

功能的实现首先从android xml文件布局开始贴代码:

<?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="wrap_content"
    android:id="@+id/lin_title_father"
    android:background="@color/titlecolor"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:orientation="horizontal"
        >
        <ImageView
            android:id="@+id/img_main_bookshelf"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:src="@mipmap/tab_bookshelf"
            android:scaleType="center"
            />

        <ImageView
            android:id="@+id/img_main_home"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:src="@mipmap/tab_home"
            android:scaleType="center"
            />
        <ImageView
            android:id="@+id/img_main_search"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:src="@mipmap/tab_search"
            android:scaleType="center"
            />
    </LinearLayout>
        <ImageView
            android:id="@+id/iv_Main_Sign"
            android:layout_width="wrap_content"
            android:layout_height="4dp"
            android:src="@mipmap/ivmainsign"
            android:scaleType="centerInside"
            />
</LinearLayout>
头部的布局

界面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_rootview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/backggroudcolor"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <include
        layout="@layout/titel_bar"
        />
    <android.support.v4.view.ViewPager
        android:id="@+id/vp_main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/searchbackgroudchcolor"
        />


</LinearLayout>
activity代码
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.shenfan.ui.activity.book.TabBookFragment;
import com.shenfan.ui.activity.home.TabHomeFragment;
import com.shenfan.ui.activity.search.TabSearchFargment;

import java.util.ArrayList;
import java.util.List;

import androidsf.androidsf.R;


public class MainActivity extends FragmentActivity implements View.OnClickListener {
    ImageView ivMainSign;
    ViewPager vpMainContent;
    private List<ImageView> views = new ArrayList<ImageView>();
    private FragmentManager fragmentManager;
    private int currentFragmentIndex;
    private int item_width;//按钮宽度
    private TabBookFragment tabBookFragment;
    private TabHomeFragment tabHomeFragment;
    private TabSearchFargment tabSearchFargment;
    private ImageView imgmainbookshelf, imgmainsearch, imgmainhome;
    ArrayList<Fragment> fragmentList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ivMainSign = (ImageView) findViewById(R.id.iv_Main_Sign);
        vpMainContent = (ViewPager) findViewById(R.id.vp_main_content);
        imgmainbookshelf = (ImageView) findViewById(R.id.img_main_bookshelf);
        imgmainhome = (ImageView) findViewById(R.id.img_main_home);
        imgmainsearch = (ImageView) findViewById(R.id.img_main_search);
        imgmainbookshelf.setOnClickListener(this);
        imgmainsearch.setOnClickListener(this);
        imgmainhome.setOnClickListener(this);
//        vpMainContent.setOffscreenPageLimit(0);
        initView();
        initViewPager();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    private void initView() {
        //计算屏幕宽度
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        item_width = dm.widthPixels / 3;
        ivMainSign.setMaxWidth(item_width);
        ivMainSign.setLayoutParams(new LinearLayout.LayoutParams(item_width,8));//设置光标的位置
        ivMainSign.setOnClickListener(this);
    }


    /**
     * 初始化viewPager
     */
    private void initViewPager() {
        fragmentList = new ArrayList<>();
        fragmentManager = getSupportFragmentManager();
        if (null == tabBookFragment)
            tabBookFragment = new TabBookFragment();
        if (null == tabHomeFragment)
            tabHomeFragment = new TabHomeFragment();
        if (null == tabSearchFargment) {
            tabSearchFargment = new TabSearchFargment();
        }


        fragmentList.add(tabBookFragment);
        fragmentList.add(tabHomeFragment);
        fragmentList.add(tabSearchFargment);

        MyFragmentPagerAdapter fragmentPagerAdapter = new MyFragmentPagerAdapter(
                fragmentManager, fragmentList);
        vpMainContent.setAdapter(fragmentPagerAdapter);
        vpMainContent.setOnPageChangeListener(new MyOnPageChangeListener());
//        vpMainContent.setCurrentItem(0);
    }

    private class MyFragmentPagerAdapter extends FragmentPagerAdapter {

        private ArrayList<Fragment> mFragments;

        public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> mFragments) {
            super(fm);
            this.mFragments = mFragments;
        }

        @Override
        public Fragment getItem(int arg0) {
            return mFragments.get(arg0);
        }

        @Override
        public int getCount() {
            return mFragments.size();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.img_main_bookshelf:
                currentFragmentIndex = 0;
                vpMainContent.setCurrentItem(currentFragmentIndex);
                break;
            case R.id.img_main_home:
                currentFragmentIndex = 1;
                vpMainContent.setCurrentItem(currentFragmentIndex);
                break;
            case R.id.img_main_search:
                currentFragmentIndex = 2;
                vpMainContent.setCurrentItem(currentFragmentIndex);
                break;
            default:

                break;

        }
    }


    public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        public void onPageSelected(int position) {
        }

        //positionx选项卡 //positionOffset比例
        @Override
        public void onPageScrolled(int position, float positionOffset,
                                   int positionOffsetPixels) {
            //获取父布局布局管理器
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ivMainSign.getLayoutParams());
            /**
             *   设置margin的值思路主要是position的值为当前fragment的下标 positionOffset为比例数当第一个页面滑动到第二个的时候positionOffset= 0
             *   如果只采用item_width * position显得有些僵硬如果加上item_width * positionOffset就有动画的效果了
             */
            layoutParams.setMargins((int) (item_width * positionOffset) + item_width * position, 0, 0, 0);
            ivMainSign.setLayoutParams(layoutParams);
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }

    }

    private long mPressedTime = 0;

    @Override
    public void onBackPressed() {
        long mNowTime = System.currentTimeMillis();//获取第一次按键时间
        if ((mNowTime - mPressedTime) > 4000) {//比较两次按键时间差
            Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
            mPressedTime = mNowTime;
        } else {//退出程序
            this.finish();
            System.exit(0);
        }
    }
}

 

 

主要思路是通过 OnPageChangeListener的onPageScrolled方法去实现光标滑动的功能



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值