基于Android的ViewPager动画特效实现页面左右滑动效果

  • 基于Android的ViewPager动画特效实现页面左右滑动效果
    第一步:打开Android Studio新建一个Android项目
    第二部:修改activity_main.xml文件代码

     
    
     
    

    添加一个ViewPager,设置一个id

Viewpager,视图翻页工具,提供了多页面切换的效果。Android 3.0后引入的一个UI控件,位于v4包中。低版本使用需要导入v4包,但是现在我们开发的APP一般不再兼容3.0及以下的系统版本,另外现在大多数使用Android studio进行开发,默认导入v7包,v7包含了v4,所以不用导包,越来越方便了。
Viewpager使用起来就是我们通过创建adapter给它填充多个view,左右滑动时,切换不同的view。Google官方是建议我们使用Fragment来填充ViewPager的,这样 可以更加方便的生成每个Page,以及管理每个Page的生命周期。

第三步:在MainActivity.java中修改代码:初始化ViewPager组件,并设置一个int数组,存放图片资源(这里的图片放到drawable-xxhdpi文件底下)

package com.example.splash;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.example.splash.fragment.SplashFragment;

public class MainActivity extends AppCompatActivity {

    private ViewPager mVpMain;

    private int[] mResIds = new int[]{
            R.drawable.bac4,
            R.drawable.bac5,
            R.drawable.bac6,
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mVpMain = findViewById(R.id.vp_main);
}

第四步:在项目包底下新建一个文件夹,命名为fragment,在创建一个名为SplashFragment的java类继承Fragment,然后在layout文件夹下面新建fragment_splash.xml的布局文件,里面放一个Image




同样是设置一个id,然后android:scaleType="centerCrop"这个属性是按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
布局文件准备好了之后去SplashFragment中重写Fragment的onCreateView()方法和onViewCreated()方法:
onCreateView()方法用于初始化layout,传入三个参数(这三个参数具体我也不知道怎么讲解)
onViewCreated()方法是通过根view为内部的view赋值

package com.example.splash.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.example.splash.R;

public class SplashFragment extends Fragment {

    private ImageView mIvContent;
    private int mResId;

    @Nullable
    @Override
    //初始化Layout
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_splash,container,false);
    }

    @Override
    //通过根View为内部的View赋值
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        mIvContent = view.findViewById(R.id.iv_content);
    }
}

Fragment用一个外部参数来初始化,我们最好是用newInstance的方式,该方法传入一个int型的参数

定义一个常量的Key,用于把外部传入的id放到Bundle中,然后设置给Fragment

	private int mResId;
    private static final String BUNDLE_KEY_RES_ID = "bundle_key_res_id";
    public static SplashFragment newInstance(int resId){
        Bundle bundle = new Bundle();
        bundle.putInt(BUNDLE_KEY_RES_ID,resId);

        SplashFragment fragment = new SplashFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

然后复写onCreate()方法,一般情况下都会从arguments去拿我们所需要的参数

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle arguments = getArguments();
        if (arguments != null){
        	//取出值赋给mResid
            mResId = arguments.getInt(BUNDLE_KEY_RES_ID);
        }
    }

然后在onViewCreated()方法中就可以设置给ImageView

mIvContent.setImageResource(mResId);

最后在AndroidManifest.xml文件中修改顶部tab为空android:theme="@style/Theme.AppCompat.NoActionBar"

效果如下:
基于Android的ViewPager动画特效实现页面左右滑动效果_第1张图片
基于Android的ViewPager动画特效实现页面左右滑动效果_第2张图片
基于Android的ViewPager动画特效实现页面左右滑动效果_第3张图片

附上我的源码:
MainActivity.java

package com.example.splash;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.example.splash.fragment.SplashFragment;

public class MainActivity extends AppCompatActivity {

    private ViewPager mVpMain;

    private int[] mResIds = new int[]{
            R.drawable.bac4,
            R.drawable.bac5,
            R.drawable.bac6,
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mVpMain = findViewById(R.id.vp_main);


        mVpMain.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int i) {
                return SplashFragment.newInstance(mResIds[i]);
            }

            @Override
            public int getCount() {
                return mResIds.length;
            }
        });
    }
}

activity_main.xml源码:




    

    

SplashFragment.java源码:

package com.example.splash.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.example.splash.R;

public class SplashFragment extends Fragment {

    private ImageView mIvContent;
    private int mResId;
    private static final String BUNDLE_KEY_RES_ID = "bundle_key_res_id";

    //把外部传入的id放到Bundle中,r然后设置给Fragment
    public static SplashFragment newInstance(int resId){
        Bundle bundle = new Bundle();
        bundle.putInt(BUNDLE_KEY_RES_ID,resId);

        SplashFragment fragment = new SplashFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle arguments = getArguments();
        if (arguments != null){
            mResId = arguments.getInt(BUNDLE_KEY_RES_ID);
        }
    }

    @Nullable
    @Override
    //初始化Layout
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_splash,container,false);
    }

    @Override
    //通过根View为内部的View赋值
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mIvContent = view.findViewById(R.id.iv_content);
        mIvContent.setImageResource(mResId);
    }
}

fragment_splash.xml源码





AndroidManifest.xml源码:




    
        
            
                

                
            
        
    


后续会编写更酷炫的滑动效果…

你可能感兴趣的:(基于Android的ViewPager动画特效实现页面左右滑动效果)