常用方法
1)ViewPager
setAdapter
设置适配器
public void setAdapter(@Nullable PagerAdapter adapter) { }
setCurrentItem
设置当前展示的哪个 item
addOnPageChangeListener
添加 page 变化的监听器
2)PagerAdapter
getCount
返回 view 的个数
destroyItem
移除 view
instantiateItem
添加 view 并返回
isViewFromObject
判断是否同一个 view
getPageTitle
可以在这里设置标题
3)FragmentPagerAdapter
getItem
返回指定 position 的 fragment
getCount
返回 fragment 的个数
getPageTitle
可以在这里设置 title
ViewPager基础使用
1)ViewPager滑动的布局文件
mytest1\src\main\res\layout\layout1.xml
我创建了3个,都是类似的,不重复贴代码了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="页面1"
android:textSize="50sp"
android:layout_centerInParent="true"
/>
</RelativeLayout>
2)activity_main.xml
mytest1\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
3)适配器 pagerAdapter
mytest1\src\main\java\com\example\mytest1\MyPagerAdapter.java
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import androidx.viewpager.widget.PagerAdapter;
import java.util.List;
/***
* 适配器
*/
public class MyPagerAdapter extends PagerAdapter {
private List<View> mViewList;
private Context mContext;
public MyPagerAdapter(Context context, List<View> mViewList) {
this.mContext = context;
this.mViewList = mViewList;
}
// 返回 View 的个数
@Override
public int getCount() {
return mViewList.size();
}
// 移除 view
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// super.destroyItem(container, position, object);
container.removeView(mViewList.get(position));
}
// 添加 view 并返回
@Override
public Object instantiateItem(ViewGroup container, int position) {
// return super.instantiateItem(container, position);
container.addView(mViewList.get(position));
return mViewList.get(position);
}
// 判断是否同一个 view
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
4)MainActivity
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
View view1 = inflater.inflate(R.layout.layout1, null);
View view2 = inflater.inflate(R.layout.layout2, null);
View view3 = inflater.inflate(R.layout.layout3, null);
List<View> mViewList = new ArrayList<>();
mViewList.add(view1);
mViewList.add(view2);
mViewList.add(view3);
ViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(new MyPagerAdapter(getApplicationContext(), mViewList));
}
}
5)效果
6)示例代码
示例代码:viewPager
ViewPager - PagerTabStrip、PagerTitleStrip
PagerTabStrip 相对 PagerTitleStrip 多了下划线的效果;
在ViewPager的布局文件中,可以将 PagerTabStrip 替换为 PagerTitleStrip 。
1)ViewPager滑动的布局文件
mytest2\src\main\res\layout\layout1.xml
我创建了3个,都是类似的,不重复贴代码了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="页面1"
android:textSize="50sp"
android:layout_centerInParent="true"
/>
</RelativeLayout>
2)activity_main.xml
mytest2\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.viewpager.widget.PagerTabStrip
android:id="@+id/pager_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:background="@color/teal_200"
/>
</androidx.viewpager.widget.ViewPager>
</LinearLayout>
3)适配器 pagerAdapter
mytest2\src\main\java\com\example\mytest2\MyPagerAdapter.java
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import androidx.viewpager.widget.PagerAdapter;
import java.util.List;
/***
* 适配器
*/
public class MyPagerAdapter extends PagerAdapter {
private List<View> mViewList;
private List<String> mViewTitle;
private Context mContext;
public MyPagerAdapter(Context context, List<View> mViewList, List<String> mViewTitle) {
this.mContext = context;
this.mViewList = mViewList;
this.mViewTitle = mViewTitle;
}
// 返回 View 的个数
@Override
public int getCount() {
return mViewList.size();
}
// 移除 view
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// super.destroyItem(container, position, object);
container.removeView(mViewList.get(position));
}
// 添加 view 并返回
@Override
public Object instantiateItem(ViewGroup container, int position) {
// return super.instantiateItem(container, position);
container.addView(mViewList.get(position));
return mViewList.get(position);
}
// 判断是否同一个 view
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
// 标题
@Override
public CharSequence getPageTitle(int position) {
// return super.getPageTitle(position);
return mViewTitle.get(position);
}
}
4)MainActivity
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
View view1 = inflater.inflate(R.layout.layout1, null);
View view2 = inflater.inflate(R.layout.layout2, null);
View view3 = inflater.inflate(R.layout.layout3, null);
List<View> mViewList = new ArrayList<>();
mViewList.add(view1);
mViewList.add(view2);
mViewList.add(view3);
List<String> mViewTitle = new ArrayList<>();
mViewTitle.add("page1");
mViewTitle.add("page2");
mViewTitle.add("page3");
ViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(new MyPagerAdapter(getApplicationContext(), mViewList, mViewTitle));
}
}
5)效果
6)示例代码
示例代码:viewPager
ViewPager - TabLayout
1)ViewPager滑动的布局文件
mytest3\src\main\res\layout\layout1.xml
我创建了3个,都是类似的,不重复贴代码了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="页面1"
android:textSize="50sp"
android:layout_centerInParent="true"
/>
</RelativeLayout>
2)activity_main.xml
mytest3\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager.widget.ViewPager>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#F3F3FA"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
3)适配器 pagerAdapter
mytest3\src\main\java\com\example\mytest3\MyPagerAdapter.java
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import androidx.viewpager.widget.PagerAdapter;
import java.util.List;
/***
* 适配器
*/
public class MyPagerAdapter extends PagerAdapter {
private List<View> mViewList;
private List<String> mViewTitle;
private Context mContext;
public MyPagerAdapter(Context context, List<View> mViewList, List<String> mViewTitle) {
this.mContext = context;
this.mViewList = mViewList;
this.mViewTitle = mViewTitle;
}
// 返回 View 的个数
@Override
public int getCount() {
return mViewList.size();
}
// 移除 view
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// super.destroyItem(container, position, object);
container.removeView(mViewList.get(position));
}
// 添加 view 并返回
@Override
public Object instantiateItem(ViewGroup container, int position) {
// return super.instantiateItem(container, position);
container.addView(mViewList.get(position));
return mViewList.get(position);
}
// 判断是否同一个 view
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
// 标题
@Override
public CharSequence getPageTitle(int position) {
// return super.getPageTitle(position);
return mViewTitle.get(position);
}
}
4)MainActivity
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
View view1 = inflater.inflate(R.layout.layout1, null);
View view2 = inflater.inflate(R.layout.layout2, null);
View view3 = inflater.inflate(R.layout.layout3, null);
List<View> mViewList = new ArrayList<>();
mViewList.add(view1);
mViewList.add(view2);
mViewList.add(view3);
List<String> mViewTitle = new ArrayList<>();
mViewTitle.add("page1");
mViewTitle.add("page2");
mViewTitle.add("page3");
ViewPager viewPager = findViewById(R.id.view_pager);
MyPagerAdapter adapter = new MyPagerAdapter(getApplicationContext(), mViewList, mViewTitle);
viewPager.setAdapter(adapter);
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab());
tabLayout.addTab(tabLayout.newTab());
tabLayout.addTab(tabLayout.newTab());
tabLayout.setupWithViewPager(viewPager);
// 在addTab的时候,设置Text,是不会生效的,代码中有removeAllTabs()
// 在adapter中的getPageTitle进行设置也是可以的
// 在这里设置,优先生效
// tabLayout.getTabAt(0).setText("tab1");
// tabLayout.getTabAt(1).setText("tab2");
// tabLayout.getTabAt(2).setText("tab3");
}
}
5)效果
6)示例代码
示例代码:viewPager
ViewPager - TabLayout - Fragment
1)ViewPager滑动的布局文件
mytest4\src\main\res\layout\layout1.xml
我创建了3个,都是类似的,不重复贴代码了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="页面1"
android:textSize="50sp"
android:layout_centerInParent="true"
/>
</RelativeLayout>
2)activity_main.xml
mytest4\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager.widget.ViewPager>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#F3F3FA"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
3)适配器 FragmentPagerAdapter
mytest4\src\main\java\com\example\mytest4\MyFragmentPagerAdapter.java
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
private List<String> titleList;
public MyFragmentPagerAdapter(FragmentManager fm,
List<Fragment> list,
List<String> titleList) {
super(fm);
this.fragmentList = list;
this.titleList = titleList;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
// return super.getPageTitle(position);
return titleList.get(position);
}
}
4)新建Fragment类
创建3个,内容类似
mytest4\src\main\java\com\example\mytest4\MyFragment1.java
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class MyFragment1 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.layout1, container, false);
return view;
}
}
5)MainActivity
mytest4\src\main\java\com\example\mytest4\MainActivity.java
import android.os.Bundle;
import android.view.Window;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
List<Fragment> fragmentList = new ArrayList<>();
fragmentList.add(new MyFragment1());
fragmentList.add(new MyFragment2());
fragmentList.add(new MyFragment3());
List<String> mViewTitle = new ArrayList<>();
mViewTitle.add("page1");
mViewTitle.add("page2");
mViewTitle.add("page3");
ViewPager viewPager = findViewById(R.id.view_pager);
MyFragmentPagerAdapter fragmentPagerAdapter = new MyFragmentPagerAdapter(
getSupportFragmentManager(), fragmentList, mViewTitle);
viewPager.setAdapter(fragmentPagerAdapter);
viewPager.setCurrentItem(0);
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab());
tabLayout.addTab(tabLayout.newTab());
tabLayout.addTab(tabLayout.newTab());
tabLayout.setupWithViewPager(viewPager);
// 在addTab的时候,设置Text,是不会生效的,代码中有removeAllTabs()
// 在adapter中的getPageTitle进行设置也是可以的
// 在这里设置,优先生效
// tabLayout.getTabAt(0).setText("tab1");
// tabLayout.getTabAt(1).setText("tab2");
// tabLayout.getTabAt(2).setText("tab3");
}
}
6)效果
7)示例代码
示例代码:viewPager
ViewPager - BottomNavigationView - Fragment
1)ViewPager滑动的布局文件
mytest5\src\main\res\layout\layout1.xml
我创建了3个,都是类似的,不重复贴代码了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="页面1"
android:textSize="50sp"
android:layout_centerInParent="true"
/>
</RelativeLayout>
2)menu/bottomnavigationview.xml
mytest5\src\main\res\menu\bottomnavigationview.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/fragment1"
android:icon="@mipmap/msg"
android:title="消息"/>
<item
android:id="@+id/fragment2"
android:icon="@mipmap/addressbook"
android:title="通讯录"/>
<item
android:id="@+id/fragment3"
android:icon="@mipmap/mine"
android:title="我"/>
</menu>
3)activity_main.xml
mytest5\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager.widget.ViewPager>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:menu="@menu/bottomnavigationview"
/>
</RelativeLayout>
4)适配器 FragmentPagerAdapter
mytest5\src\main\java\com\example\mytest5\MyFragmentPagerAdapter.java
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
this.fragmentList = list;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
5)新建Fragment类
创建3个,内容类似
mytest5\src\main\java\com\example\mytest5\MyFragment1.java
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class MyFragment1 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.layout1, container, false);
return view;
}
}
6)MainActivity
mytest5\src\main\java\com\example\mytest5\MainActivity.java
import android.os.Bundle;
import android.view.MenuItem;
import android.view.Window;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private BottomNavigationView bottomNavigationView;
private MyFragmentPagerAdapter fragmentPagerAdapter;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
List<Fragment> fragmentList = new ArrayList<>();
fragmentList.add(new MyFragment1());
fragmentList.add(new MyFragment2());
fragmentList.add(new MyFragment3());
fragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentList);
viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(fragmentPagerAdapter);
viewPager.setCurrentItem(0);
viewPager.addOnPageChangeListener(onPageChangeListener);
bottomNavigationView = findViewById(R.id.bottom_navigation_view);
bottomNavigationView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener);
}
private ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
int itemID = R.id.fragment1;
switch (position) {
case 0:
itemID = R.id.fragment1;
break;
case 1:
itemID = R.id.fragment2;
break;
case 2:
itemID = R.id.fragment3;
break;
}
bottomNavigationView.setSelectedItemId(itemID);
}
@Override
public void onPageScrollStateChanged(int state) { }
};
private BottomNavigationView.OnNavigationItemSelectedListener onNavigationItemSelectedListener =
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.fragment1:
viewPager.setCurrentItem(0, true);
return true;
case R.id.fragment2:
viewPager.setCurrentItem(1, true);
return true;
case R.id.fragment3:
viewPager.setCurrentItem(2, true);
return true;
}
return false;
}
};
}
7)效果
8)示例代码
示例代码:viewPager
ViewPager - 旋转效果
1)ViewPager滑动的布局文件
mytest6\src\main\res\layout\layout1.xml
我创建了3个,都是类似的,不重复贴代码了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/msg"/>
</RelativeLayout>
2)menu/bottomnavigationview.xml
mytest6\src\main\res\menu\bottomnavigationview.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/fragment1"
android:icon="@mipmap/msg"
android:title="消息"/>
<item
android:id="@+id/fragment2"
android:icon="@mipmap/addressbook"
android:title="通讯录"/>
<item
android:id="@+id/fragment3"
android:icon="@mipmap/mine"
android:title="我"/>
</menu>
3)activity_main.xml
mytest6\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.viewpager.widget.ViewPager>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:menu="@menu/bottomnavigationview"
/>
</RelativeLayout>
4)适配器 FragmentPagerAdapter
mytest6\src\main\java\com\example\mytest6\MyFragmentPagerAdapter.java
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
this.fragmentList = list;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
5)自定义PagerTransformer
mytest6\src\main\java\com\example\mytest6\MyPagerTransformer.java
import android.view.View;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.ViewPager;
public class MyPagerTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(@NonNull View page, float position) {
float max_rotation = 20.0f;
if (position < -1) {
rotate(page, -max_rotation);
} else if (position <= 1) {
rotate(page, max_rotation * position);
} else {
rotate(page, max_rotation);
}
}
private void rotate(View view, float r) {
view.setPivotX(view.getWidth() * 0.2f);
view.setPivotY(view.getHeight());
view.setRotation(r);
}
}
6)新建Fragment类
创建3个,内容类似
mytest6\src\main\java\com\example\mytest6\MyFragment1.java
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class MyFragment1 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.layout1, container, false);
return view;
}
}
7)MainActivity
mytest6\src\main\java\com\example\mytest6\MainActivity.java
import android.os.Bundle;
import android.view.MenuItem;
import android.view.Window;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private BottomNavigationView bottomNavigationView;
private MyFragmentPagerAdapter fragmentPagerAdapter;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
List<Fragment> fragmentList = new ArrayList<>();
fragmentList.add(new MyFragment1());
fragmentList.add(new MyFragment2());
fragmentList.add(new MyFragment3());
fragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentList);
viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(fragmentPagerAdapter);
viewPager.setCurrentItem(0);
viewPager.addOnPageChangeListener(onPageChangeListener);
viewPager.setPageTransformer(true, new MyPagerTransformer());
bottomNavigationView = findViewById(R.id.bottom_navigation_view);
bottomNavigationView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener);
}
private ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
int itemID = R.id.fragment1;
switch (position) {
case 0:
itemID = R.id.fragment1;
break;
case 1:
itemID = R.id.fragment2;
break;
case 2:
itemID = R.id.fragment3;
break;
}
bottomNavigationView.setSelectedItemId(itemID);
}
@Override
public void onPageScrollStateChanged(int state) { }
};
private BottomNavigationView.OnNavigationItemSelectedListener onNavigationItemSelectedListener =
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.fragment1:
viewPager.setCurrentItem(0, true);
return true;
case R.id.fragment2:
viewPager.setCurrentItem(1, true);
return true;
case R.id.fragment3:
viewPager.setCurrentItem(2, true);
return true;
}
return false;
}
};
}
7)效果
8)示例代码
示例代码:viewPager