基于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"
附上我的源码:
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源码:
后续会编写更酷炫的滑动效果…