Android free levitating window.

Overview

FloatingX

Scan with Detekt ktlint

FloatingX 一个灵活的 免权限 悬浮窗解决方案。

👏 特性

  • 链式调用,无感知插入
  • 支持滑动,自动吸附,兼容多指触摸
  • Kotlin-dsl
  • 自动修复显示位置
  • 支持对悬浮窗生命周期的监听
  • 支持自定义悬浮窗各项配置
  • 支持自定义拖动边框,吸附边框
  • 支持App 内全局悬浮窗,单 Activity 悬浮窗

👨‍🔧‍ Loading

1.x Todo

  • 支持拖动到指定方向显示回收悬浮窗设计
  • 初始化方式简化
  • 多个悬浮窗时的自动规避覆盖
  • 自定义显示隐藏动画效果
  • 单个 ViewGroup 悬浮窗

2.x Todo

  • 悬浮窗方案自动选择
    • 全局悬浮窗(需要申请权限)
    • 单App 悬浮窗
    • 单个 Activity 悬浮窗
    • 单个 ViewGroup 悬浮窗

👨‍💻‍ 使用方式

Gradle

allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
dependencies {
	        implementation 'com.github.Petterpx:FloatingX:1.0-beta02'
	}

初始化-Application

Kotlin

FloatingX.init {
    context(this@CustomApplication)
    marginEdge(10f)
    addBlackClass(MainActivity::class.java, NewActivity::class.java)
    layout(R.layout.item_floating)
    x(100f)
    y(100f)
    defaultDirection(Direction.RIGHT_OR_BOTTOM)
    setViewLifecycle(xx)
    setScrollListener(xx)
}

Java

FxHelper config = FxHelper.builder()
    .layout(R.layout.item_floating)
    .x(100f)
    .y(100f)
    .defaultDirection(Direction.RIGHT_OR_BOTTOM)
    .setViewLifecycle(xx)
    .setScrollListener(xx)
    .context(this)
    .marginEdge(10f)
    .isEdgeEnable(true)
    .addBlackClass(MainActivity::class.java, NewActivity::class.java)
    .build();
FloatingX.init(config);

控制器

 FloatingX.show()
 FloatingX.show(activity)
 FloatingX.hide()
 FloatingX.dismiss()
 FloatingX.cancel()

更多控制

FloatingX.control() - >

    @MainThread
    fun show(activity: Activity)

    /** 安装在指定activity上 */
    fun attach(activity: Activity)

    /** 安装在指定FrameLayout上 */
    fun attach(container: FrameLayout)

    /** 从指定activity上删除 */
    fun detach(activity: Activity)

    /** 从指定FrameLayout上删除 */
    fun detach(container: FrameLayout)
    
    @MainThread
    fun show()

    @MainThread
    fun hide()

    /** 关闭 */
    @MainThread
    fun dismiss()

    /** 获取自定义的view */
    fun getView(): View?

    /** 当前是否显示 */
    fun isShowRunning(): Boolean

    /** 更新params */
    @MainThread
    fun updateParams(params: ViewGroup.LayoutParams)

    /** 提供一个回调入口,用于快捷刷新 */
    @MainThread
    fun updateView(obj: (FxViewHolder) -> Unit)

    /** 更新当前view */
    @MainThread
    fun updateView(@LayoutRes resource: Int)

    fun setClickListener(obj: (View) -> Unit)

进阶使用

wiki loading


🚴‍♀️ 业务决定方案

对于悬浮窗方案,我们常见有两种实现方式:

  • 前者是基于 WindowManager,从而不依赖 Activity ,实现添加 View ,达到悬浮窗的目的。
  • 后者基于 Activity-DecorView 动态添加移除 view ,从而达到悬浮窗目的。

🖐 综合对比:

实现方案 app内显示 app外显示 头部app方案 兼容性 显示效果 权限请求
WindowManager (8.0+)
Activity-DecorView

代表支持 、 效果好 、 效果极佳

代表 不需要或者不支持。

如果app需要 app外显示悬浮窗 ,及是 游戏sdk 相关,以及需要支持 语音通话 这种,那么 WMS 这种方案是最好。

如果app 不需要app外显示 ,不想申请权限,对显示效果可接受(接受 Activity 切换时悬浮窗的闪动,当然也有补救措施),那么后者方案适合你。

头部app采用悬浮窗的:

微信,QQ,采用的基本都是 WMS 的方案(很大程度是因为音视频),知乎 采用的是免权限。


🐬 技术实现

基于 DecorView 的的实现方案,全局持有一个单独的悬浮窗 View ,通过 AppLifecycle 监听 Activity 生命周期,并在相应时机 插入到 DecorView 上 。

具体如下:

Activity-setContentView

具体参见我的博客:源码分析 | Activity-setContentView

Ps: 为什么要插入到 DecorView ,而不是 R.id.content -> FrameLayout ?

插入到 DecorView 可以最大程度控制悬浮窗的自由度,即悬浮窗可以真正意义上[全屏]拖动。

插入到 content 中,其拖动范围其实为 应用视图范围 ,即摆放位置 受到 状态栏底部导航栏 以及 默认的 AppBar 影响, 比如当用户隐藏了状态栏或者导航栏,相对应的视图大小会发生改变,将影响悬浮窗的位置摆放。

👍 感谢

基础 悬浮窗View 源自 EnFloatingViewFloatingMagnetView 实现方式,并在其基础上增加了一些改进!

Comments
  • 频繁切换页面,引起黑屏崩溃

    频繁切换页面,引起黑屏崩溃

    java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/core/view/WindowInsetsCompat$Type;
            at com.petterp.floatingx.impl.control.FxAppControlImpl$windowsInsetsListener$2$1.onApplyWindowInsets(FxAppControlImpl.kt:25)
            at androidx.core.view.ViewCompat$1.onApplyWindowInsets(ViewCompat.java:2474)
            at android.view.View.dispatchApplyWindowInsets(View.java:11469)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7406)
            at android.view.ViewGroup.newDispatchApplyWindowInsets(ViewGroup.java:7431)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7413)
            at android.view.ViewRootImpl.dispatchApplyInsets(ViewRootImpl.java:2595)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2999)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2252)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8791)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1140)
            at android.view.Choreographer.doCallbacks(Choreographer.java:962)
            at android.view.Choreographer.doFrame(Choreographer.java:887)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1125)
            at android.os.Handler.handleCallback(Handler.java:938)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:257)
            at android.app.ActivityThread.main(ActivityThread.java:8259)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)
    
    opened by likfe 8
  • AndroidStudio4.1.3 编译问题

    AndroidStudio4.1.3 编译问题

    大佬好,请问我用了AndroidStudio4.1.3开启最新的专案..会出这错误 请问能如何处理呢?谢谢 image 另外我按了 Use JDK from project structure 后,会跳出这错误 This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 2020.3.1 or newer. 再拜托您帮忙小弟解答下,谢谢

    opened by lin0603 6
  • 在安卓11,机型redmi k2o pro上没有任何效果

    在安卓11,机型redmi k2o pro上没有任何效果

    参考主页以下方式创建悬浮窗,在安卓11上没有任何效果,机型 redmi k2o pro ,辛苦支持

    AppHelper helper = AppHelper.builder() .setLayout(R.layout.item_floating) .setLayoutView(view) .enableFx() .build(); FloatingX.init(helper);

    bug fix 
    opened by gitcfly 5
  • 设置右上角 怎么不起作用

    设置右上角 怎么不起作用

    private val fragmentFx by createFx {
            setLayout(R.layout.....)
            .setGravity(FxGravity.RIGHT_OR_TOP)
                .build().toControl(this@HomeFragment)
        }
    
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/ll_careModel"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:alpha="0.8"
        android:gravity="center"
        android:orientation="vertical"
        android:paddingTop="10dp"
        android:paddingBottom="10dp">
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/icon_cardmodel_heart" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text=""
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="16sp"
            />
    
    </LinearLayout>
    

    这样写 还是在左上角·

    bug fix 
    opened by 594238813 4
  • 如何全局使用?

    如何全局使用?

    我把以下代码添加了,AndroidManifest.xml也设置了Application,但是啥也没发生,也没有日志。

    open class App: Application() {
        override fun onCreate() {
            super.onCreate()
            Log.d("AAA", "onCreate: onCreate: ")
            FloatingX.init {
                // 设置context
                setContext(this@App)
                // 设置悬浮窗layout
                setLayout(R.layout.layout_floating)
                // 设置悬浮窗默认方向
                setGravity(Direction.RIGHT_OR_BOTTOM)
                // 设置是否启用日志
                setEnableLog(true)
    
                // 启用辅助方向
                setEnableAssistDirection(0f, 0f, 0f, 100f)
                // 设置x轴默认坐标
    //            setX()
                // 设置y轴默认坐标
    //            setY()
    
                // 设置启用边缘吸附
                setEnableEdgeAdsorption(true)
                // 设置边缘偏移量
                setEdgeOffset(10f)
                // 设置启用悬浮窗可屏幕外回弹
                setEnableScrollOutsideScreen(true)
                // 设置辅助方向辅助
                // 设置点击事件
    //            setOnClickListener { }
                // 设置view-lifecycle监听
    //            setViewLifecycle()
    
                // 设置启用悬浮窗位置修复
                setEnableAbsoluteFix(true)
                // 设置启用动画
                setEnableAnimation(true)
                // 设置启用动画实现
    
                // 设置底部偏移量
                setBottomBorderMargin(100f)
                // 设置顶部偏移量
    //            setTopBorderMargin(100f)
                // 设置左侧偏移量
                setLeftBorderMargin(100f)
                // 设置右侧偏移量
                setRightBorderMargin(100f)
    
                // 设置允许触摸事件
                setEnableTouch(true)
    
                // 设置悬浮窗LayoutParams
    //            setLayoutParams()
                // 设置要显示的activity
                addBlackClass(
                    MainActivity::class.java,
                )
                // 设置允许全部activity显示悬浮窗,默认false
                setEnableAllBlackClass(true)
    
                // 设置tag-Activity生命周期回调时的触发
                setTagActivityLifecycle {
                    onCreated { activity, bundle ->
                    }
                    onResumes { }
                }
                setEnableLog(true)
                // 只有调用了show,默认才会启用fx,否则fx不会自动插入activity
                show()
            }
        }
    }
    
    opened by ve3344 2
  • 使用过程中bugly上报视图空指针异常。

    使用过程中bugly上报视图空指针异常。

    08-24 17:48:28.381 7140 7140 E AndroidRuntime: java.lang.NullPointerException: null cannot be cast to non-null type android.view.ViewGroup

    16008-24 17:48:28.381 7140 7140 E AndroidRuntime: at java.util.Objects.requireNonNull(Objects.java:245) 16108-24 17:48:28.381 7140 7140 E AndroidRuntime: at com.petterp.floatingx.view.FxMagnetView.v(SourceFile:1) 16208-24 17:48:28.381 7140 7140 E AndroidRuntime: at com.petterp.floatingx.view.FxMagnetView.s(SourceFile:1) 16308-24 17:48:28.381 7140 7140 E AndroidRuntime: at com.petterp.floatingx.view.FxMagnetView.b(Unknown Source:0) 16408-24 17:48:28.381 7140 7140 E AndroidRuntime: at com.petterp.floatingx.view.b.run(Unknown Source:4) 16508-24 17:48:28.381 7140 7140 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:938) 16608-24 17:48:28.381 7140 7140 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) 16708-24 17:48:28.381 7140 7140 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:233) 16808-24 17:48:28.381 7140 7140 E AndroidRuntime: at android.os.Looper.loop(Looper.java:344) 16908-24 17:48:28.381 7140 7140 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8204) 17008-24 17:48:28.381 7140 7140 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 17108-24 17:48:28.381 7140 7140 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589) 17208-24 17:48:28.381 7140 7140 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071)

    opened by bozaixing 1
Releases(1.1.6)
  • 1.1.6(Jan 1, 2023)

    相比1.1.4做了什么更改?

    • 调整了 hide() 方法逻辑
    • 调整了build的配置逻辑,修复version在打包时的错误

    #64 @Petterpx

    Source code(tar.gz)
    Source code(zip)
  • 1.1.4(Dec 6, 2022)

    相比1.1.3新增了以下功能: FxGravity 新增居中位置,具体如下:

    • CENTER 居中
    • TOP_OR_CENTER 顶部居中
    • BOTTOM_OR_CENTER 底部居中
    • LEFT_OR_CENTER 左侧居中(原有)
    • RIGHT_OR_CENTER 右侧居中(原有)
    Source code(tar.gz)
    Source code(zip)
  • 1.1.3(Nov 21, 2022)

    相比1.1.2修复了以下问题:

    • 修复gravity逻辑异常 #59
    • 修复局部浮窗插入时无法控制gravity,已调整api

    相比1.1.2 调整了以下api: 局部浮窗(不包含Activity级别)现在插入时调整 group 为FrameLayout

    构建工具现在支持自动版本。

    Source code(tar.gz)
    Source code(zip)
  • 1.1.2(Oct 26, 2022)

  • 1.1.1(Oct 26, 2022)

    相比1.1.0做了什么改变?

    • 调整了手势事件的判断逻辑,效率更高

    更改或删除了以下api

    • 运行时配置更新IFxConfigHelper接口重名为IFxConfigControl;
    • 移除了updateManagerParams(),后续可以通过getManagerView()自行设置;
    • 更新 updateManagerView() 为 updateView(),便于更新View视图。更接近语义;
    • 更新 updateView() 为 updateContentView(),从而实现更新内容viewid;
    • 移除 ktx部分扩展,后续统一使用 createFx 创建;
    • 部分 api 方法禁止在Java生成。
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Oct 21, 2022)

    相比1.0.7做了什么改变?

    • 重构了手势事件的传递流程,多指事件更加顺畅,并修复了一些问题;
    • 重构了初始化时,默认位置的逻辑;

    更改或删除了以下api

    • 不再支持保存历史位置(视图大小存在不确定性,此方法存在不可控);
    • 移除了子浮窗layoutParams的初始化配置,layoutId的通过xml即可,自定义View的建议初始化View时手动设置;
    • 新增了 setManagerView() ,用于设置浮窗的params;
    • 浮窗生命周期接口 IFxViewLifecycle 新增 initView(),用于浮窗View初始化以及每次刷新时调用。
    Source code(tar.gz)
    Source code(zip)
  • 1.0.7(Oct 16, 2022)

    相比 1.0.6 做了什么改变? 修复了黑名单的调用逻辑。

    新增了以下方法:

    • setEnableAllInstall(Boolean) 是否允许全局显示悬浮窗
    • addInstallWhiteClass(Activity.class) 允许显示浮窗的activity, setEnableAllBlackClass(false) 时,此方法生效
    • addInstallBlackClass(Activity.class ) 添加禁止显示悬浮窗的activity, setEnableAllBlackClass(true)时,此方法生效 删除了以下方法:
    • addBlackClass
    • setEnableAllBlackClass

    部分Api进行更新 FloatingX.init() 目前会直接返回 IFxAppControl

    #49

    Source code(tar.gz)
    Source code(zip)
  • 1.0.6(Sep 7, 2022)

  • 1.0.5(Sep 4, 2022)

    bug-fix

    • 修复了 setLayoutView()时,params 的逻辑异常
    • 修复了java语境下无法调用 FxViewHolder-getView()

    相比1.0.4 新增或修改以下功能:

    • 重新配置了FxViewHolder的功能分发
    • 梳理了kotlin-internal 修饰方法的在java语境中的可见性
    • 调整了 updateManagerView,updateView 时传递的参数,使用java接口(便于java,kotlin中默认会优化) 代替原来的lambda函数,避免java中new Funcation尴尬情况
    • 调整 setClickListener 时传递的参数为View.OnClickListener
    Source code(tar.gz)
    Source code(zip)
  • 1.0.4(Aug 25, 2022)

  • 1.0.3(Aug 23, 2022)

    支持通过传递view的方式更新浮窗视图。

    • updateManagerView(view)
    • updateManagerView(obj:(Context)->View)
    1. 如果是全局浮窗,则view的context必须是application,局部浮窗则必须非application,如果传递错误,将抛出异常提示。为了便于设置,您可通过后者的方式。借此您将根据当前的浮窗等级获得合适的 context ,最后返回View即可。
    2. 如果您之前有设置layoutParams(配置方法中设置过),此layoutparams将只会用于layoutId设置的布局,您通过传递view设置的视图将不会采用此layoutParams,默认情况下,将采用wrap-wrap。对于自定义的view,建议您自行设置layoutparams,或者。
    3. layoutid与layoutView的最终取决于最终调用的是谁,后者会将前者重置为默认值。
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Jun 26, 2022)

  • 1.0.1(May 31, 2022)

  • 1.0(May 31, 2022)

    1.0版本发布

    • 单例持有浮窗view
    • 支持各项回调监听
    • 支持自定义是否保存历史位置及还原
    • 支持插入 ViewGroup , Fragment , Activity
    • 允许自定义悬浮窗各项指标,自定义隐藏显示动画
    • 支持 越界回弹,多指触摸,小屏适配,屏幕旋转
    • ....

    自1.0-rc14 做了什么改变:

    • 修复了边缘回弹开启无效
    • 移除了 AppHelper-setContext() 方法
    • 完善了底部导航栏高度的测量规则
    • 优化了部分代码的包装方式
    Source code(tar.gz)
    Source code(zip)
  • 1.0-rc14(Dec 4, 2021)

    • 优化onTouchEvent中的事件处理逻辑: IFxScrollListener新增eventIng(MotionEvent)用于接收touchEvent所有事件;优化dragIng()方法,新增MotionEvent返回;
    • 修改kotlin与appcompat依赖方式为implementation,无需手动引入;
    • 降低appcompat版本到1.2
    Source code(tar.gz)
    Source code(zip)
  • 1.0-rc13(Nov 19, 2021)

  • 1.0-rc12(Nov 15, 2021)

  • 1.0-rc11(Nov 11, 2021)

  • 1.0-rc10(Nov 9, 2021)

  • 1.0-rc09(Nov 8, 2021)

  • 1.0-rc08(Oct 30, 2021)

  • 1.0-rc07(Oct 14, 2021)

  • 1.0-rc06(Sep 21, 2021)

  • 1.0-rc05(Sep 13, 2021)

  • 1.0-rc03(Aug 23, 2021)

  • 1.0-rc02(Aug 23, 2021)

  • 1.0-rc01(Aug 23, 2021)

  • 1.0-beta15(Jun 10, 2021)

  • 1.0-beta14(Jun 10, 2021)

  • 1.0-beta13(Jun 9, 2021)

Owner
Petterp
Petterp
A simple app to showcase Androids Material Design and some of the cool new cool stuff in Android Lollipop. RecyclerView, CardView, ActionBarDrawerToggle, DrawerLayout, Animations, Android Compat Design, Toolbar

#Android-LollipopShowcase This is a simple showcase to show off Android's all new Material Design and some other cool new stuff which is (new) in Andr

Mike Penz 1.8k Nov 10, 2022
A simple app to showcase Androids Material Design and some of the cool new cool stuff in Android Lollipop. RecyclerView, CardView, ActionBarDrawerToggle, DrawerLayout, Animations, Android Compat Design, Toolbar

#Android-LollipopShowcase This is a simple showcase to show off Android's all new Material Design and some other cool new stuff which is (new) in Andr

Mike Penz 1.8k Nov 10, 2022
simple android grocery app using kotlin and android studio

Project Idea The idea of this project is to make a grocery android app that users can use to order the groceries they want. It doesn't contain any bac

null 0 Nov 29, 2021
Beetlebug is an open source insecure Android application with CTF challenges built for Android Penetration Testers and Bug Bounty hunters.

Beetlebug Beetlebug is a beginner-friendly Capture the Flag Android application that aims to inspire interest in Mobile Application Security. It is ge

Hafiz Abdulaziz 60 Oct 11, 2022
Do's and Don'ts for Android development, by Futurice developers

Best practices in Android development Avoid reinventing the wheel by following these guidelines. Lessons learned from Android developers in Futurice.

Futurice 20.2k Dec 31, 2022
Learning RxJava for Android by example

Learning RxJava for Android by example This is a repository with real-world useful examples of using RxJava with Android. It usually will be in a cons

Kaushik Gopal 7.6k Dec 30, 2022
A sample Android app which showcases advanced usage of Dagger among other open source libraries.

U+2020 A sample Android app which showcases advanced usage of Dagger among other open source libraries. Watch the corresponding talk or view the slide

Jake Wharton 5.7k Dec 22, 2022
Proguard configurations for common Android libraries

android-proguard-snippets Example Proguard configurations for common Android libraries. This project assumes that your ProGuard configuration is based

Kevin Schultz 4.6k Dec 18, 2022
Examples of Android applications

Android Demos This is a collection of basic android examples created by Novoda. CarouselFragment CompassExample ContactSelector CustomActivityTransiti

Novoda 2k Jan 3, 2023
A simple chat demo for socket.io and Android

socket.io-android-chat This is a simple chat demo for socket.io and Android. You can connect to https://socket-io-chat.now.sh using this app. Installa

Naoyuki Kanezawa 1.9k Dec 30, 2022
Google Play game services - Android samples

Google Play game services - Android Samples Copyright (C) 2014 Google Inc. Contents These are the Android samples for Google Play game services. Colle

Google Play Game Services 952 Dec 27, 2022
Android common lib demo, include ImageCache, HttpCache, DropDownListView, DownloadManager, install apk silent and so on, you can find description

android-demo 关于我,欢迎关注 微博:Trinea 主页:trinea.cn 邮箱:trinea.cn#gmail.com 微信:codek2 依赖:trinea-android-common android-auto-scroll-view-pager viewpager-indica

Trinea 1.1k Nov 10, 2022
Cheat Sheet for Android Interviews

Android-Cheat-sheet Cheat Sheet for Android Interviews Topics Common Coding Programs Data Structure Coding Programs Android Interview Questions Java I

Anitaa Murthy 2k Dec 31, 2022
RxJava architecture library for Android

Reference Architecture for Android using RxJava This is an ambitious reference project of what can be done with RxJava to create an app based on strea

Reark 2.1k Dec 17, 2022
📚 Sample Android Components Architecture on a modular word focused on the scalability, testability and maintainability written in Kotlin, following best practices using Jetpack.

Android Components Architecture in a Modular Word Android Components Architecture in a Modular Word is a sample project that presents modern, 2020 app

Madalin Valceleanu 2.3k Dec 30, 2022
Collection of Small Android Projects

AndroidDemoProjects ActivityRecognition: Example of using Google Play Services to recognize a user's activity, such as running, walking, or riding a b

Paul Ruiz 601 Dec 9, 2022
Sample material transition animations for Android

See ListOfThings for a newer implementation. Android Material Transitions This Android project samples some Material Design-ish transitions for list i

Todd Way 1.2k Dec 7, 2022
[] Explorations around Android custom layouts

android-layout-samples Explorations around Android custom layouts, including off main thread View measure/layout passes. Sample code for: Composite Vi

Lucas Rocha 796 Nov 15, 2022