我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android CoordinatorLayout+AppBarLayout顶部栏吸顶效果的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android CoordinatorLayout+AppBarLayout顶部栏吸顶效果的实现

1.控件简介。

CoordinatorLayout遵循Material 风格,包含在 support Library中,结合AppbarLayout, CollapsingToolbarLayout等 可 产生各种炫酷的折叠悬浮效果。

    作为最上层的View
    作为一个容器与一个或者多个子View进行交互

    CoordinatorLayout is intended for two primary use cases: As a top-level application decor or chrome layout; As a container for a specific interaction with one or more child views.

常见结合体-AppBarLayout:

它是继承与LinearLayout的,默认的方向是Vertical:

appbarLayout的滑动flag:

我们可以通过两种方法设置这个Flag:

    方法一:setScrollFlags(int)
    方法二:app:layout_scrollFlags="scroll|enterAlways"

AppBarLayout必须作为CoordinatorLayout的直接子View,否则它的大部分功能将不会生效,如layout_scrollFlags等。
 

2.效果图。

画面収録 2023-05-26 20.10.41

3.所用到的依赖。

//控件用到的依赖api "androidx.appcompat:appcompat:1.4.0"//沉浸式状态栏框架导入// 基础依赖包,必须要依赖api "com.geyifeng.immersionbar:immersionbar:3.2.2"// kotlin扩展(可选)api "com.geyifeng.immersionbar:immersionbar-ktx:3.2.2"//刷新和加载Layout导入,核心必须依赖api "com.scwang.smart:refresh-layout-kernel:2.0.1"api "com.scwang.smart:refresh-header-classics:2.0.1"    //经典刷新头api "com.scwang.smart:refresh-header-material:2.0.1"    //谷歌刷新头api 'com.github.hackware1993:MagicIndicator:1.7.0'

4.布局代码。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                

注意一点:那个可滑动的 View 不能是 ListView,ScrollView 这种旧包下的控件,否则也是不起作用的。

app:layout_scrollFlags="scroll|enterAlways,前面已经说到app:layout_scrollFlags=scroll的时候,这个View会跟着滚动事件响应,app:layout_scrollFlags=“enterAlways”的时候这个View会响应下拉事件。所以呈现出来的结果应该是我们在上拉的时候toolBar会隐藏,下拉的时候toolBar会出来;如果当我们的toolBar等于app:layout_scrollFlags="scroll|snap"的时候 ,app:layout_scrollFlags=scroll的时候,这个View会跟着滚动事件响应,app:layout_scrollFlags=“snap”的时候在Scroll滑动事件结束以前 ,如果这个View部分可见,那么这个View会停在最接近当前View的位置。具体就自己研究了。

再说我这个需求的效果:栏常驻,有两个Toolbar,第一个Toolbar实际上是一个占位View,第二个Toolbar才是真正的常驻栏,上滑的时候沉浸式栏渐变,上滑到二级与栏吸顶,app:layout_scrollFlags="scroll|exitUntilCollapsed",上拉的时候,这个View会跟着滑动直到折叠成第一个Toolbar大小,下方的ViewPager设置app:layout_behavior="@string/appbar_scrolling_view_behavior"属性才可以与Toolbar进行吸顶,这样就与第二个Toolbar正常吸顶了。

BaseActivtiy的代码。

package com.phone.library_common.baseimport android.app.ActivityManagerimport android.content.Intentimport android.content.res.Configurationimport android.content.res.Resourcesimport android.graphics.Colorimport android.graphics.drawable.GradientDrawableimport android.os.Bundleimport android.os.Looperimport android.os.Processimport android.view.Gravityimport android.view.Viewimport android.view.WindowManagerimport android.widget.FrameLayoutimport android.widget.TextViewimport android.widget.Toastimport androidx.databinding.DataBindingUtilimport androidx.databinding.ViewDataBindingimport com.gyf.immersionbar.ImmersionBarimport com.phone.library_common.BaseApplicationimport com.phone.library_common.Rimport com.phone.library_common.manager.ActivityPageManagerimport com.phone.library_common.manager.CrashHandlerManagerimport com.phone.library_common.manager.LogManagerimport com.phone.library_common.manager.ResourcesManagerimport com.phone.library_common.manager.ToolbarManagerimport com.phone.library_common.manager.ToolbarManager.Companion.assistActivityimport com.qmuiteam.qmui.widget.QMUILoadingViewimport com.trello.rxlifecycle3.components.support.RxAppCompatActivityabstract class BaseBindingRxAppActivity : RxAppCompatActivity(), IBaseView {    private val TAG = BaseBindingRxAppActivity::class.java.simpleName    protected lateinit var loadView: QMUILoadingView    protected lateinit var layoutParams: FrameLayout.LayoutParams    //该类绑定的ViewDataBinding    protected lateinit var mDatabind: DB    protected lateinit var mRxAppCompatActivity: RxAppCompatActivity    protected lateinit var mBaseApplication: BaseApplication    private var mActivityPageManager: ActivityPageManager? = null    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        mRxAppCompatActivity = this        mBaseApplication = application as BaseApplication        mActivityPageManager = ActivityPageManager.get()        mActivityPageManager?.addActivity(this)        mDatabind = DataBindingUtil.setContentView(this, initLayoutId())        mDatabind.lifecycleOwner = mRxAppCompatActivity        initData()        initViews()        loadView = QMUILoadingView(this)        loadView.also {            it.visibility = View.GONE            it.setSize(100)            it.setColor(ResourcesManager.getColor(R.color.color_333333))        }        layoutParams = FrameLayout.LayoutParams(            FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT        )        layoutParams.gravity = Gravity.CENTER        addContentView(loadView, layoutParams)        initLoadData()    }    override fun onConfigurationChanged(newConfig: Configuration) {        //非默认值        if (newConfig.fontScale != 1f) {            resources        }        super.onConfigurationChanged(newConfig)    }    override fun getResources(): Resources? { //还原字体大小        val res = super.getResources()        //非默认值        if (res.configuration.fontScale != 1f) {            val newConfig = Configuration()            newConfig.setToDefaults() //设置默认            res.updateConfiguration(newConfig, res.displayMetrics)        }        return res    }    protected abstract fun initLayoutId(): Int    protected open fun setToolbar(isDarkFont: Boolean) {        if (isDarkFont) {            ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度                .statusBarDarkFont(isDarkFont)                .statusBarColor(R.color.color_FFFFFFFF) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .keyboardEnable(true)                .init()        } else {            ImmersionBar.with(this)                .statusBarDarkFont(isDarkFont)                .statusBarColor(R.color.color_FF198CFF) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .keyboardEnable(true)                .init()        }        ToolbarManager.assistActivity(findViewById(android.R.id.content))    }    protected open fun setToolbar(isDarkFont: Boolean, isResizeChildOfContent: Boolean) {        if (isDarkFont) {            ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度                .statusBarDarkFont(isDarkFont)                .statusBarColor(R.color.color_FFFFFFFF) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .keyboardEnable(true)                .init()        } else {            ImmersionBar.with(this)                .statusBarDarkFont(isDarkFont)                .statusBarColor(R.color.color_FF198CFF) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .keyboardEnable(true)                .init()        }        if (isResizeChildOfContent) {            ToolbarManager.assistActivity(findViewById(android.R.id.content))        }    }    protected open fun setToolbar(isDarkFont: Boolean, color: Int) {        if (isDarkFont) {            ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度                .statusBarDarkFont(isDarkFont)                .statusBarColor(color) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .init()        } else {            ImmersionBar.with(this)                .statusBarDarkFont(isDarkFont)                .statusBarColor(color) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .init()        }        ToolbarManager.assistActivity(findViewById(android.R.id.content))    }    protected open fun setToolbar(        isDarkFont: Boolean,        color: Int,        isResizeChildOfContent: Boolean    ) {        if (isDarkFont) {            ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度                .statusBarDarkFont(isDarkFont)                .statusBarColor(color) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .init()        } else {            ImmersionBar.with(this)                .statusBarDarkFont(isDarkFont)                .statusBarColor(color) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .init()        }        if (isResizeChildOfContent) {            ToolbarManager.assistActivity(findViewById(android.R.id.content))        }    }    protected open fun setToolbar2(isDarkFont: Boolean, statusBarColor: Int) {        if (isDarkFont) {            ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度                .statusBarDarkFont(isDarkFont)                .statusBarColor(statusBarColor) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .keyboardEnable(true)                .init()        } else {            ImmersionBar.with(this)                .statusBarDarkFont(isDarkFont)                .statusBarColor(statusBarColor) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .keyboardEnable(true)                .init()        }    }        protected open fun setToolbar2(        isDarkFont: Boolean,        statusBarColor: Int,        isResizeChildOfContent: Boolean    ) {        if (isDarkFont) {            val window = window            window.clearFlags(                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS                        or WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION            )            window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION                    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)            window.statusBarColor = Color.TRANSPARENT            //        window.setNavigationBarColor(Color.TRANSPARENT);            ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度                .statusBarDarkFont(isDarkFont)                .statusBarColor(statusBarColor) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .keyboardEnable(true)                .init()        } else {            ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度                .statusBarDarkFont(isDarkFont)                .statusBarColor(statusBarColor) //状态栏颜色,不写默认透明色                //                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦                .keyboardEnable(true)                .init()            val window = window            window.clearFlags(                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS                        or WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION            )            window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION                    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)            window.statusBarColor = Color.TRANSPARENT            //        window.setNavigationBarColor(Color.TRANSPARENT);        }        if (isResizeChildOfContent) {            assistActivity(findViewById(android.R.id.content))        }    }    protected abstract fun initData()    protected abstract fun initViews()    protected abstract fun initLoadData()    protected open fun showToast(message: String?, isLongToast: Boolean) {        //        Toast.makeText(this, message, Toast.LENGTH_LONG).show();        if (!mRxAppCompatActivity.isFinishing) {            val toast: Toast            val duration: Int            duration = if (isLongToast) {                Toast.LENGTH_LONG            } else {                Toast.LENGTH_SHORT            }            toast = Toast.makeText(mRxAppCompatActivity, message, duration)            toast.setGravity(Gravity.CENTER, 0, 0)            toast.show()        }    }    protected open fun showCustomToast(        left: Int, right: Int,        textSize: Int, textColor: Int,        bgColor: Int, height: Int,        roundRadius: Int, message: String?,        isLongToast: Boolean    ) {        val frameLayout = FrameLayout(this)        val layoutParams = FrameLayout.LayoutParams(            FrameLayout.LayoutParams.WRAP_CONTENT,            FrameLayout.LayoutParams.WRAP_CONTENT        )        frameLayout.layoutParams = layoutParams        val textView = TextView(this)        val layoutParams1 = FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, height)        textView.layoutParams = layoutParams1        textView.setPadding(left, 0, right, 0)        textView.textSize = textSize.toFloat()        textView.setTextColor(textColor)        textView.gravity = Gravity.CENTER        textView.includeFontPadding = false        val gradientDrawable = GradientDrawable() //创建drawable        gradientDrawable.setColor(bgColor)        gradientDrawable.cornerRadius = roundRadius.toFloat()        textView.background = gradientDrawable        textView.text = message        frameLayout.addView(textView)        val toast = Toast(this)        toast.setView(frameLayout)        if (isLongToast) {            toast.duration = Toast.LENGTH_LONG        } else {            toast.duration = Toast.LENGTH_SHORT        }        toast.show()    }    open fun isOnMainThread(): Boolean {        return Looper.getMainLooper().thread.id == Thread.currentThread().id    }    protected open fun startActivity(cls: Class<*>?) {        val intent = Intent(this, cls)        startActivity(intent)    }    protected open fun startActivityForResult(cls: Class<*>?, requestCode: Int) {        val intent = Intent(this, cls)        startActivityForResult(intent, requestCode)    }    open fun getActivityPageManager(): ActivityPageManager? {        return mActivityPageManager    }    private fun killAppProcess() {        LogManager.i(TAG, "killAppProcess")        val manager =            mBaseApplication.getSystemService(ACTIVITY_SERVICE) as ActivityManager        val processInfos = manager.runningAppProcesses        // 先杀掉相关进程,最后再杀掉主进程        for (runningAppProcessInfo in processInfos) {            if (runningAppProcessInfo.pid != Process.myPid()) {                Process.killProcess(runningAppProcessInfo.pid)            }        }        LogManager.i(TAG, "执行killAppProcess,應用開始自殺")        val crashHandlerManager = CrashHandlerManager.get()        crashHandlerManager?.saveTrimMemoryInfoToFile("执行killAppProcess,應用開始自殺")        try {            Thread.sleep(1000)        } catch (e: InterruptedException) {            LogManager.i(TAG, "error")        }        Process.killProcess(Process.myPid())        // 正常退出程序,也就是结束当前正在运行的 java 虚拟机        System.exit(0)    }    override fun onDestroy() {        if (mActivityPageManager?.mIsLastAliveActivity?.get() == true) {            killAppProcess()        }        mActivityPageManager?.removeActivity(mRxAppCompatActivity)        super.onDestroy()    }}

Activtiy的代码。

package com.phone.module_main.mounting;import android.graphics.Color;import androidx.fragment.app.Fragment;import com.alibaba.android.arouter.facade.annotation.Route;import com.phone.library_common.adapter.TabFragmentStatePagerAdapter;import com.phone.library_common.base.BaseBindingRxAppActivity;import com.phone.library_common.manager.LogManager;import com.phone.library_common.manager.ResourcesManager;import com.phone.library_common.manager.ScreenManager;import com.phone.module_main.R;import com.phone.module_main.databinding.ActivityMountingBinding;import com.phone.module_main.mounting.adapter.MineCommonNavigatorAdapter;import com.phone.module_main.mounting.fragment.CommodityFragment;import net.lucode.hackware.magicindicator.ViewPagerHelper;import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;import java.util.ArrayList;import java.util.List;@Route(path = "/module_main/mounting")public class MountingActivity extends BaseBindingRxAppActivity {    private static final String TAG = MountingActivity.class.getSimpleName();    private int imvBannerHeight;    private int slideMaxHeight;    @Override    protected int initLayoutId() {        return R.layout.activity_mounting;    }    @Override    protected void initData() {    }    @Override    protected void initViews() {        setToolbar2(false, R.color.color_transparent, false);        setMounting();        mDatabind.imvBack.setColorFilter(ResourcesManager.getColor(R.color.color_FFFFFFFF));        mDatabind.layoutBack.setOnClickListener(v -> {            finish();        });        mDatabind.refreshLayout.setOnRefreshListener(refreshLayout -> {            setData();            mDatabind.refreshLayout.finishRefresh(1000);        });        setData();    }    private void setMounting() {        mDatabind.imvBanner.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {            if (mDatabind.imvBanner.getHeight() > 0) {                imvBannerHeight = mDatabind.imvBanner.getHeight();                slideMaxHeight = imvBannerHeight                        - ScreenManager.getDimenPx(R.dimen.dp_73)                        - ScreenManager.getDimenPx(R.dimen.dp_1);            }        });        mDatabind.appBarLayout.addOnOffsetChangedListener((appBarLayout1, verticalOffset) -> {            if (verticalOffset < 0) {                setToolbar2(true, R.color.color_transparent, false);                double slideHeight = Math.abs(verticalOffset);                if (slideHeight < slideMaxHeight) {                    int proportion = (int) ((slideHeight / slideMaxHeight) * 255);                    LogManager.i(TAG, "proportion******" + proportion);                    int color = Color.argb(proportion, 255, 255, 255);                    mDatabind.toolbar.setBackgroundColor(color);                } else {                    mDatabind.toolbar.setBackgroundColor(ResourcesManager.getColor(R.color.color_FFFFFFFF));                }                mDatabind.tevTitle.setTextColor(ResourcesManager.getColor(R.color.color_99000000));                mDatabind.imvBack.setColorFilter(ResourcesManager.getColor(R.color.color_99000000));            } else {                setToolbar2(false, R.color.color_transparent, false);                mDatabind.toolbar.setBackgroundColor(ResourcesManager.getColor(R.color.color_transparent));                mDatabind.tevTitle.setTextColor(ResourcesManager.getColor(R.color.color_FFFFFFFF));                mDatabind.imvBack.setColorFilter(ResourcesManager.getColor(R.color.color_FFFFFFFF));            }        });    }    private void setData() {        List titleList = new ArrayList<>();        titleList.add("苹果手机");        titleList.add("口红");        titleList.add("包包");        //创建indicator适配器        MineCommonNavigatorAdapter mineCommonNavigatorAdapter = new MineCommonNavigatorAdapter(titleList);        CommonNavigator commonNavigator = new CommonNavigator(this);        commonNavigator.setAdjustMode(true);//自我调节位置,实现自我平分        commonNavigator.setAdapter(mineCommonNavigatorAdapter);        mineCommonNavigatorAdapter.setOnIndicatorTapClickListener(position -> {            mDatabind.viewPager.setCurrentItem(position);        });        mDatabind.magicIndicator.setNavigator(commonNavigator);        List fragmentList = new ArrayList<>();        for (int i = 0; i < titleList.size(); i++) {            fragmentList.add(CommodityFragment.get(titleList.get(i)));        }        TabFragmentStatePagerAdapter tabFragmentStatePagerAdapter =                new TabFragmentStatePagerAdapter(getSupportFragmentManager(), fragmentList);        mDatabind.viewPager.setAdapter(tabFragmentStatePagerAdapter);        ViewPagerHelper.bind(mDatabind.magicIndicator, mDatabind.viewPager);    }    @Override    protected void initLoadData() {    }    @Override    public void showLoading() {    }    @Override    public void hideLoading() {    }}

如对此有疑问,请联系qq1164688204。

推荐Android开源项目

项目功能介绍:RxJava2 和Retrofit2 项目,使用Kotlin+RxJava2+Retrofit2+MVP架构+组件化/Kotlin+Retrofit2+协程+MVVM架构+组件化,添加自动管理token 功能,添加RxJava2 生命周期管理,集成极光推送、阿里云Oss对象存储和高德地图定位功能。

项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

来源地址:https://blog.csdn.net/NakajimaFN/article/details/130892776

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android CoordinatorLayout+AppBarLayout顶部栏吸顶效果的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android进阶CoordinatorLayout协调者布局实现吸顶效果

这篇文章主要为大家介绍了Android进阶CoordinatorLayout协调者布局实现吸顶效果,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-29

Android 实现当下最流行的吸顶效果

开始逐渐领略到ItemDecoration的美~ 今天让我 使用 ItemDecoration 来完成 可推动的悬浮导航栏的效果,最终实现的效果如下图:具体实现步骤如下: 根据我前面的文章所讲的RecyclerView的基本使用,我们先来完
2022-06-06

Android实现顶部悬浮效果

本文实例为大家分享了Android实现顶部悬浮效果的具体代码,供大家参考,具体内容如下效果图 布局
2023-05-30

RecyclerVIew实现悬浮吸顶效果

RecyclerVIew实现悬浮吸顶效果图 这里写图片描述主页面布局2023-05-30

Android实现酷炫的顶部栏

AppBarLayout 是继承LinerLayout实现的一个ViewGroup容器组件,它是为了Material Design设计的App Bar,支持手势滑动操作的,不过经常与Toolbar、CoordinatorLayout以及Co
2022-06-06

如何使用Android实现上拉吸顶效果

这篇文章给大家分享的是有关如何使用Android实现上拉吸顶效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下效果图1.home_layout.xml此布局即可实现上拉标题固定在顶部
2023-06-29

Android Jetpack Compose如何实现列表吸顶效果

这篇文章主要介绍“Android Jetpack Compose如何实现列表吸顶效果”,在日常操作中,相信很多人在Android Jetpack Compose如何实现列表吸顶效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-06-29

Android仿微信顶/底部菜单栏效果

本文要实现仿微信微信底部菜单栏+顶部菜单栏,采用ViewPage来做,每一个page对应一个XML,当手指在ViewPage左右滑动时,就相应显示不同的page(其实就是xml)并且同时改变底部菜单按钮的图片变暗或变亮,同时如果点击底部菜单
2022-06-06

Webview 和 React Native 中吸顶效果实现

在移动端开发中,webview 已经成为很重要的一部分,比如 app 中内嵌的 web 页面,或者小程序的视图载体,本质上都是 webview。

Android实现滑动到顶部悬停的效果

先来看下要实现效果图:查阅资料后,发现网上大部分都是用这种方法实现的: 多写一个和需要悬浮的部分一模一样的layout,先把浮动区域的可见性设置为gone。当浮动区域滑动到顶部的时候,就把浮动区域B的可见性设置为VISIBLE。这样看起来就
2022-06-06

Android应用中怎实现一个顶部导航栏滑动效果

本篇文章给大家分享的是有关Android应用中怎实现一个顶部导航栏滑动效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.向app Module中的build.gradle中
2023-05-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录