Android studio中使用ViewPager和BottomNavigationView实现底部导航栏和碎片的同步切换

这篇具有很好参考价值的文章主要介绍了Android studio中使用ViewPager和BottomNavigationView实现底部导航栏和碎片的同步切换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

通过几次的踩雷和摸索,完成了以上的操作,本教程写的详细全面,包教包会,对新手有好,看了不会的联系我,我倒立洗头给你看。

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

1.需要了解的一些知识

所需控件:

fragment

作为Android中最常用的控件,它有自己的声明周期,可以粗略地等比为能够分屏的activity,但是和activity有区别,fragment有自己的生命周期和接收、处理用户的事件。Fragment必须是依存与Activity而存在的。所以他们可以有自己的xml文件(布局文件)和class文件(处理逻辑的java类文件)。

Viewpager

ViewPager是可以实现多个界面的左右滑动的控件。ViewPager最典型的应用场景主要包 括引导页导航,轮转广告和页面菜单。其中有两个ViewPager适配器需要使用:

  • FragmentStatePagerAdapter:

    它是 PagerAdapter 的子类,用于处理多个碎片,并支持动态加载和销毁碎片来节省内存。适用于需要处理大量页面、支持动态刷新以及动态添加或删除页面的场景。例如图片浏览器、新闻阅读器等。

  • FragmentPagerAdapter:

    它也 是 PagerAdapter 的子类,与 FragmentStatePagerAdapter 类似,但有一些不同之处。与 FragmentStatePagerAdapter 相比,FragmentPagerAdapter 更适用于静态、数量有限的页面集合,并提供更好的滑动性能和用户体验,因为它不会销毁已经创建的碎片实例。

我们接下来要使用的是FragmentPagerAdapter。

java语法结构

List<>

List<> 是 Java 中的泛型类,一种动态数组,用于表示一个列表,可以存储任意类型的元素。在使用 List<> 时,需要在尖括号中指定具体的类型参数。可以实现增,删,替换等操作。举个例子

 List<String> stringList = new ArrayList<>();
 stringList.add("Hello");
 stringList.add("World");
 ​
 List<Integer> integerList = new ArrayList<>();
 integerList.add(1);
 integerList.add(2);
 ​
 for (String str : stringList) {
     System.out.println(str);
 }
 ​
 for (int num : integerList) {
     System.out.println(num);
 }

  ​首先,创建了一个 List<String> 类型的列表 stringList,并向其中添加两个字符串元素 "Hello" 和 "World"。

接下来,创建了一个 List<Integer> 类型的列表 integerList,并向其中添加两个整数元素 1 和 2。

然后,通过使用增强型 for 循环,分别对 stringListintegerList 进行迭代遍历,将列表中的元素逐个取出,并分别打印输出。

在第一个循环中,每次迭代将当前的字符串元素赋值给变量 str,然后将其输出。因此,在循环的第一次迭代中,会输出 "Hello",在第二次迭代中,会输出 "World"。

在第二个循环中,每次迭代将当前的整数元素赋值给变量 num,然后将其输出。因此,在循环的第一次迭代中,会输出 1,第二次迭代中,会输出 2。

所以最终的输出结果是:

 Hello
 World
 1
 2

2.准备工作

1.导入所需包

在build.gradle文件中引入implementation 'com.google.android.material:material:1.9.0'

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

当导入进去后,可能会有版本不一样的情况,如果报黄,点击alt+enter键,会出现修改版本的选项。当引入完以后,就可以点击sync进行数据操作同步。如果已经有了这个包就可以不用管他了。

2.创建三个fragment

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

根据我上述截图来操作,创建三个名字分别为homeFragment,moreFragment,userFragment。其对应布局文件名字为fragment_home,fragment_more,fragment_user。

创建好后三个fragment的class里面的暂时先不用管

3.创建menu

BottomNavigationView 可以来创建底部导航栏,而菜单项组合menu就在其中。

先在res文件夹中创建一个menu文件夹

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

然后创建一个名为menu的xml文件,将下列代码写进文件中:

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
 ​
     <item
         android:id="@+id/item_home"
         android:icon="@drawable/home"
         android:title="@string/home"
         />
 ​
     <item
         android:id="@+id/item_more"
         android:icon="@drawable/more"
         android:title="@string/more"
         />
 ​
     <item
         android:id="@+id/item_user"
         android:icon="@drawable/user"
         android:title="@string/user"
         />
 ​
 </menu>
 

其中@drawable/user是drawable下的user.png,一张图片,由 android:icon引用。同理"@string/user"是 res/values/strings.xml文件里的<string name="user">用户</string>代码,这样,底部导航栏菜单项的标题就会显示为 "用户"。这里推荐使用阿里矢量图标库。drawable文件是用于存放图片的,把图复制粘贴进去就行。其中名字不能为中文等字符,不然会报错。

 android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

4.编写ViewPagerAdapter继承FragmentPagerAdapter

完成底部导航栏的切换我们需要FragmentPagerAdapter的帮助,所以创建并编写ViewPagerAdapter类(这是我取的名字,想取什么名字都行)继承FragmentPagerAdapter。

代码如下:

package com.example.bnvone.Adapter;
 ​
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentPagerAdapter;
 ​
 import java.util.List;
 ​
 public class ViewPagerAdapter extends FragmentPagerAdapter {
     private List<Fragment> mfragmentList;
     public ViewPagerAdapter(@NonNull FragmentManager fm,List<Fragment> fragmentList) {
         super(fm);//调用父类构造函数,传递FragmentManager 参数
                   //用于确保适配器类内部具有有效的 FragmentManager 实例,从而顺利完成片段管理和展示的任务
         this.mfragmentList = fragmentList;
 ​
     }//设置 ViewPager 的适配器。
 ​
 ​
     @NonNull
     @Override
     public Fragment getItem(int position) {
         return  mfragmentList == null ? null: mfragmentList.get(position);
     }// mfragmentList == null ? null 判断mfragmentList是否为空,如果不为null,执行:后面的代码。
      //mfragmentList.get(position)获得第position个的fragment对象返回
 ​
     @Override
     public int getCount() {
         return  mfragmentList == null ? null: mfragmentList.size();
         // 返回片段对象的数量,即mfragmentList列表中的元素个数
     }
 }
 
 ​

这个适配器的作用是将 Fragment 列表与 ViewPager 关联起来,以便在 ViewPager 中展示相应的内容。通过重写 getItemgetCount 方法,适配器可以根据位置返回对应的 Fragment 对象,并在 ViewPager 中正确显示。其中重写的方法我们会在MainActivity中调用。

前期准备的差不多了,可以开始实现了。

3.实现底部导航栏同步切换操作

1.创建MainActivity

 <?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"
     android:orientation="vertical"
     >
 ​
     <androidx.viewpager.widget.ViewPager
         android:id="@+id/vp"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1"
      />
 ​
 ​
     <com.google.android.material.bottomnavigation.BottomNavigationView
         android:id="@+id/nav_bottom"
         android:layout_width="match_parent"
         android:layout_height="60dp"
         android:background="#ffffff"
         app:menu="@menu/menu_nav"
         />
 ​
 ​
 ​
 </LinearLayout>
 ​

使用的线性布局,也可以使用其他的。出现vp <androidx.viewpager.widget.ViewPager>: No speakable text present问题不大,可以运行。得到的样子是这样的

 android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

2.编写MainActivity

 package com.example.bnvone;
 ​
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.fragment.app.Fragment;
 import androidx.viewpager.widget.ViewPager;
 ​
 import android.annotation.SuppressLint;
 import android.os.Bundle;
 import android.view.MenuItem;
 ​
 import com.example.bnvone.Adapter.ViewPagerAdapter;
 import com.example.bnvone.Fragment.homeFragment;
 import com.example.bnvone.Fragment.moreFragment;
 import com.example.bnvone.Fragment.userFragment;
 ​
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 ​
 import java.util.ArrayList;
 import java.util.List;
 ​
 public class MainActivity extends AppCompatActivity {
     private BottomNavigationView navigationView;
     private ViewPager viewPager;
 ​
 ​
     @Override
     protected void onCreate(Bundle savedInstanceState) {
 ​
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 ​
         navigationView = findViewById(R.id.nav_bottom);
         viewPager = findViewById(R.id.vp);
 ​
         homeFragment homeFragment= new homeFragment();
 ​
         List<Fragment> fragments = new ArrayList<>();
         fragments.add(new homeFragment()); //新建一个homeFragment对象将这个对象加入到数组fragments中
         fragments.add(new moreFragment());
         fragments.add(new userFragment());
 ​
         ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(),fragments);
         //创建对象并通过构造函数初始化,该适配器可以知道要显示哪些片段。
         viewPager.setAdapter(viewPagerAdapter);
         //将前面创建的 viewPagerAdapter 适配器设置给 viewPager 视图组件,以便在 ViewPager 中显示相应的页面。
         //底部导航栏监听事件
         navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
             @SuppressLint("NonConstantResourceId")
             @Override
             public boolean onNavigationItemSelected(@NonNull MenuItem item) {
             //根据菜单ID显示页面
                 switch (item.getItemId()) {//监听事件中,点击菜单立马执行item.getItemId()方法
                     //item.getItemId() 方法用于获取选中的 MenuItem 的唯一标识符(ID)
                     case R.id.item_home://R.id.xxx是整数类型。
                         viewPager.setCurrentItem(0);
                         // 将 ViewPager 的当前页面显示成索引为 0 的页面
                         return true;
                     case R.id.item_more:
                         viewPager.setCurrentItem(1);
                         return true;
                     case R.id.item_user:
                         viewPager.setCurrentItem(2);
                         return true;
                 }
                 return false;
             }
 ​
         });
 ​
         // 添加页面切换的监听器,根据页面切换实现菜单切换
     viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
         @Override
         public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 ​
         }
 ​
         @Override
         public void onPageSelected(int position) {
         switch (position){  // 根据页面位置更新导航栏的选中状态
             case 0:
                 navigationView.setSelectedItemId(R.id.item_home);
                 //将导航栏中的选中项设置为 R.id.item_home
                 break;
             case 1:
                 navigationView.setSelectedItemId(R.id.item_more);
                 break;
             case 2:
                 navigationView.setSelectedItemId(R.id.item_user);
                 break;
         }
      }
 ​
         @Override
         public void onPageScrollStateChanged(int state) {}
     });//通过使用页面切换监听器,
         // 我们可以根据页面切换的情况来更改导航栏的选中状态,
         // 从而实现页面切换时导航栏菜单的同步切换效果。
 ​
     }
 }
 ​
 

实现了底部导航栏与 ViewPager 的联动效果。底部导航栏通过监听选中项的改变,然后根据选中项对应的页面索引,调用 ViewPager 的 setCurrentItem 方法来切换到相应的页面。同时,ViewPager 添加了页面切换的监听器,通过监听页面的切换事件,更新底部导航栏的选中状态,以实现同步切换效果。

完成以下操作就可以实现同步切换了。

补充

我的fragment代码:

<?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout 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=".Fragment.moreFragment">
 ​
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent">
 ​
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="2"
             android:textSize="50sp" />
 ​
     </LinearLayout>
 </androidx.constraintlayout.widget.ConstraintLayout>
 

本次操作所需要所有文件:

 android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

效果如下:

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

是不是很简单,有手就行

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

会了的话就给个推荐之类的吧,各位兄弟们

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

----------------2023年11月23日修改----------------

拓展使用

随着软件的不断成熟,导航栏的样式也变得越来越多,各大APP顶部导航栏流行使用字体当做顶部导航栏,并在选中后实现放大等样式改变的效果。

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,androidandroid studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,androidandroid studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

我们来简单实现一下这种效果:

创建viewpagerActivity

创建一个新的activity,命名viewpagerActivity;

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=".viewpagerActivity"
    android:orientation="vertical">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textView1"
            android:text="动态"
            android:textSize="20sp"
            android:layout_marginLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <TextView
            android:id="@+id/textView2"
            android:text="排行榜"
            android:textSize="20sp"
            android:layout_marginLeft="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>


    </LinearLayout>


    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        tools:ignore="SpeakableTextPresentCheck">


    </androidx.viewpager.widget.ViewPager>


</LinearLayout>

是这种效果:

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android

再按上文创建两个fragment,一个oneFragment,一个twoFragment;

java文件
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

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

public class viewpagerActivity extends AppCompatActivity {
    TextView textView1;
    TextView textView2;
    ViewPager viewPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_viewpager);
        textView1 = findViewById(R.id.textView1);
        textView2 = findViewById(R.id.textView2);
        viewPager = findViewById(R.id.viewPager);


        List<Fragment> fragments = new ArrayList<>();
        fragments.add(new oneFragment());
        fragments.add(new twoFragment());

        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(),fragments);
        viewPager.setAdapter(viewPagerAdapter);
        textView1.animate().scaleX(1.5f).scaleY(1.5f).setDuration(0).withEndAction(new Runnable() {
            @Override
            public void run() {

            }
        }).start();
        textView1.setTextColor(Color.BLACK);
        textView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                textView1.setTextColor(Color.BLACK);
                viewPager.setCurrentItem(0);
            }
        });

        textView2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                viewPager.setCurrentItem(1);
            }
        });

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

                switch (position){
                    case 0:
                        textView1.animate().scaleX(1.5f).scaleY(1.5f).setDuration(100).withEndAction(new Runnable() {
                            @Override
                            public void run() {

                            }
                        }).start();
                        textView2.animate().scaleX(1f).scaleY(1f).setDuration(100).withEndAction(new Runnable() {
                            @Override
                            public void run() {

                            }
                        }).start();
                        textView1.setTextColor(Color.BLACK);
                        textView2.setTextColor(Color.GRAY);
                        break;
                    case 1:
                        textView2.animate().scaleX(1.5f).scaleY(1.5f).setDuration(100).withEndAction(new Runnable() {
                            @Override
                            public void run() {

                            }
                        }).start();
                        textView1.animate().scaleX(1f).scaleY(1f).setDuration(100).withEndAction(new Runnable() {
                            @Override
                            public void run() {

                            }
                        }).start();
                        textView2.setTextColor(Color.BLACK);
                        textView1.setTextColor(Color.GRAY);
                        break;
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });


    }
    
}

完成后的效果如下:

android studio viewpager,Android studio,Viewpager,BottomNavigationView,开发语言,java,android studio,前端,android文章来源地址https://www.toymoban.com/news/detail-719273.html

到了这里,关于Android studio中使用ViewPager和BottomNavigationView实现底部导航栏和碎片的同步切换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android底部导航栏之BottomNavigationView

    1,首先需要添加依赖: implementation \\\'com.google.android.material:material:1.1.0\\\' 2,布局文件中引入: 3,常用属性: app:itemTextColor 文字的颜色,可以通过 selector 来控制选中和未选中的颜色 app:itemIconTint 图标的颜色,可以通过 selector 来控制选中和未选中的颜色 app:itemIconSize 图标大小,

    2024年02月08日
    浏览(74)
  • 【Android】底部导航栏【BottomNavigationView】+【ViewPage2】

    问题需求 实现底部导航栏切换 问题解决 最简单的实现方式就是使用系统自动生成的模板页面,但是有时候会有一些问题,特别是需要去除【ActionBar】的情况下,这种情况下使用系统的模板页面就不好用了,此时可以使用下面这种解决方式。 【BottomNavigationView】+【ViewPage2】

    2023年04月18日
    浏览(46)
  • Android Studio 关于BottomNavigationView 无法预览视图我的解决办法

    一、前言:最近在尝试一步一步开发一个自己的软件,刚开始遇到的问题就是当我们引用 二、我的解决方案: 1.先把这两个文件删掉 2.file-----invalidate 3.考虑到版本兼容性我还修改了  把版本降低了 就可见了

    2024年02月14日
    浏览(35)
  • Android修行手册 - 使用ViewPager2实现画廊效果

    Unity3D特效百例 案例项目实战源码 Android-Unity实战问题汇总 游戏脚本-辅助自动化 Android控件全解手册 再战Android系列 Scratch编程案例 软考全系列 Unity3D学习专栏 蓝桥系列 ChatGPT和AIGC 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、工具、素材、源码、游戏等

    2024年02月22日
    浏览(46)
  • 【Android】使用ViewPager2实现轮播图效果,手动/自动轮播图

    这里使用Gilde进行加载图片:Glide 使用Gilde可以加载网络图片还可以提高图片加载性能。 接下来新建一个子布局item_image,加载viewPage2的子布局。 ViewPage2就是使用recyclerView实现的,所以这里使用方法其实类似。 这里直接继承RecyclerView.Adapter即可,代码很简单不必多说。 创建一个

    2024年02月03日
    浏览(50)
  • Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

    1. 实现效果    效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频源本身就不适合全屏,会把视频拉伸,效果不好。 抖音上的视频源应该都有严格的宽高尺寸,才能做到全屏有很好的效

    2023年04月09日
    浏览(41)
  • Android 之 ViewPager 的简单使用

    本节带来的是Android 3.0后引入的一个UI控件——ViewPager(视图滑动切换工具),实在想不到 如何来称呼这个控件,他的大概功能:通过手势滑动可以完成View的切换,一般是用来做APP 的引导页或者实现图片轮播,因为是3.0后引入的,如果想在低版本下使用,就需要引入v4 兼容包哦

    2024年02月06日
    浏览(49)
  • Android——禁止ViewPager的左右滑动功能实现

    Android——禁止ViewPager的左右滑动功能实现 在Android开发中,ViewPager是一种常用的滑动控件,用于实现页面的左右切换效果。然而,在某些场景中,我们可能需要禁止ViewPager的左右滑动功能,只允许通过其他方式进行页面切换。本文将介绍如何在Android中实现禁止ViewPager左右滑动

    2024年02月06日
    浏览(46)
  • Android kotlin 实现仿蜜源ViewPager和指示器对应上面TabLayout功能

    在 app 的 build.gradle 在添加以下代码 1、 TabLayout : implementation \\\'com.google.android.material:material:1.1.0\\\' 2、 implementation \\\'com.github.li-xiaojun:StateLayout:1.3.4\\\' //allprojects {…增加:maven { url ‘https://jitpack.io’ }…} 3、 implementation \\\'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6\\\' ,这个里面带的适配

    2024年02月09日
    浏览(74)
  • 使用Android Studio实现图片滤镜应用

    简介: 本文将介绍如何使用Android Studio开发一个图片滤镜应用。通过应用中提供的滤镜效果,用户可以对图片进行美化和编辑。我们将使用Android Studio提供的图像处理库和一些常见的滤镜算法来实现这个应用。 步骤一:创建新项目 打开Android Studio并创建一个新的项目。在项目

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包