mirror of
https://github.com/kuba2k2/NavLib.git
synced 2025-01-18 06:16:43 -06:00
Fix system bars colors, bottom sheet dragging, dark theme switching
This commit is contained in:
parent
d0e79b6fbb
commit
f2fef9ddbd
6
.idea/render.experimental.xml
generated
6
.idea/render.experimental.xml
generated
@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RenderSettings">
|
||||
<option name="showDecorations" value="true" />
|
||||
</component>
|
||||
</project>
|
@ -1,25 +1,62 @@
|
||||
package pl.szczodrzynski.navigation
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.widget.Switch
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import android.widget.Toast
|
||||
import androidx.core.widget.NestedScrollView
|
||||
import com.google.android.material.bottomappbar.BottomAppBar
|
||||
import android.view.WindowManager
|
||||
import android.os.Build
|
||||
import kotlinx.android.synthetic.main.sample_nav_view.*
|
||||
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
companion object {
|
||||
var darkTheme: Boolean? = null
|
||||
}
|
||||
|
||||
var showing = false
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
if (darkTheme == null)
|
||||
darkTheme = getSharedPreferences("prefs", Context.MODE_PRIVATE).getBoolean("darkTheme", false)
|
||||
|
||||
Log.d("MainActivity", "Dark theme $darkTheme")
|
||||
setTheme(if (darkTheme == true) R.style.AppTheme else R.style.AppTheme_Light)
|
||||
|
||||
setContentView(R.layout.sample_nav_view)
|
||||
|
||||
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or (when {
|
||||
darkTheme == true -> 0
|
||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
|
||||
else -> 0
|
||||
})
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
val w = window // in Activity's onCreate() for instance
|
||||
w.setFlags(
|
||||
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
|
||||
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
|
||||
)
|
||||
}
|
||||
|
||||
button.setOnClickListener {
|
||||
// use commit instead of apply because of recreating the activity
|
||||
darkTheme = (darkTheme == false)
|
||||
getSharedPreferences("prefs", Context.MODE_PRIVATE).edit().putBoolean("darkTheme", darkTheme == true).commit()
|
||||
recreate()
|
||||
}
|
||||
|
||||
/*val dim = findViewById<View>(R.id.view)
|
||||
|
||||
val nestedScrollView = findViewById<View>(R.id.nestedScrollView)
|
||||
|
@ -6,15 +6,18 @@
|
||||
<item name="colorPrimary">#64b5f6</item>
|
||||
<item name="colorPrimaryDark">#1976d2</item>
|
||||
<item name="colorPrimaryVariant">#1976d2</item>
|
||||
<item name="colorAccent">#ba68c8</item>
|
||||
<item name="colorSecondary">#ba68c8</item>
|
||||
<item name="colorSecondaryVariant">#9c27b0</item>
|
||||
<item name="colorAccent">#ff6e40</item>
|
||||
<item name="colorSecondary">#ff6e40</item>
|
||||
<item name="colorSecondaryVariant">#ff3d00</item>
|
||||
<item name="android:colorBackground">@color/black</item>
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
<item name="colorSurface">#1f1f1f</item>
|
||||
|
||||
<item name="android:statusBarColor" tools:targetApi="lollipop">?android:colorBackground</item>
|
||||
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
|
||||
<item name="android:navigationBarColor" tools:targetApi="lollipop">?colorPrimaryDark</item>
|
||||
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
|
||||
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">false</item>
|
||||
|
||||
<item name="android:navigationBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
|
||||
<item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">false</item>
|
||||
|
||||
<item name="colorOnPrimary">#000000</item>
|
||||
<item name="colorOnSecondary">#000000</item>
|
||||
@ -24,6 +27,8 @@
|
||||
<item name="nv_actionBarBackground">?colorSurface</item>
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
|
||||
|
||||
</style>
|
||||
|
||||
<style name="AppTheme.Light" parent="NavView.Light">
|
||||
@ -31,16 +36,18 @@
|
||||
<item name="colorPrimary">#2196f3</item>
|
||||
<item name="colorPrimaryDark">#1976d2</item>
|
||||
<item name="colorPrimaryVariant">#90caf9</item>
|
||||
<item name="colorAccent">#ba68c8</item>
|
||||
<item name="colorSecondary">#ba68c8</item>
|
||||
<item name="colorSecondaryVariant">#9c27b0</item>
|
||||
<item name="colorAccent">#ff6e40</item>
|
||||
<item name="colorSecondary">#ff6e40</item>
|
||||
<item name="colorSecondaryVariant">#ff3d00</item>
|
||||
<item name="android:colorBackground">@color/white</item>
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
<item name="colorSurface">#ffffff</item>
|
||||
|
||||
<item name="android:statusBarColor" tools:targetApi="lollipop">?android:colorBackground</item>
|
||||
<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
|
||||
<item name="android:navigationBarColor" tools:targetApi="lollipop">?colorPrimaryDark</item>
|
||||
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
|
||||
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">false</item>
|
||||
|
||||
<item name="android:navigationBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
|
||||
<item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">false</item>
|
||||
|
||||
<item name="colorOnPrimary">#000000</item>
|
||||
<item name="colorOnSecondary">#000000</item>
|
||||
|
@ -1,23 +1,26 @@
|
||||
package pl.szczodrzynski.navlib
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.util.AttributeSet
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.MotionEvent
|
||||
import android.view.MotionEvent.INVALID_POINTER_ID
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import androidx.core.view.MotionEventCompat
|
||||
import android.widget.SeekBar
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import androidx.core.view.*
|
||||
import androidx.core.widget.NestedScrollView
|
||||
import androidx.customview.widget.ViewDragHelper
|
||||
import com.google.android.material.bottomappbar.BottomAppBar
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_COLLAPSED
|
||||
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HIDDEN
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import kotlinx.android.synthetic.main.nav_view.view.*
|
||||
|
||||
class NavView : FrameLayout {
|
||||
|
||||
@ -36,6 +39,35 @@ class NavView : FrameLayout {
|
||||
private val displayWidth: Int by lazy { configuration.screenWidthDp }
|
||||
private val displayHeight: Int by lazy { configuration.screenHeightDp }
|
||||
|
||||
fun getTopInset(view: View): Float {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
(view.rootWindowInsets?.systemWindowInsetTop ?: 24)
|
||||
} else {
|
||||
24
|
||||
}*displayMetrics.density
|
||||
}
|
||||
fun getLeftInset(view: View): Float {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
(view.rootWindowInsets?.systemWindowInsetLeft ?: 0)
|
||||
} else {
|
||||
0
|
||||
} * displayMetrics.density
|
||||
}
|
||||
fun getRightInset(view: View): Float {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
(view.rootWindowInsets?.systemWindowInsetRight ?: 0)
|
||||
} else {
|
||||
0
|
||||
} * displayMetrics.density
|
||||
}
|
||||
fun getBottomInset(view: View): Float {
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
(view.rootWindowInsets?.systemWindowInsetBottom ?: 48)
|
||||
} else {
|
||||
48
|
||||
} * displayMetrics.density
|
||||
}
|
||||
|
||||
constructor(context: Context) : super(context) {
|
||||
init(null, 0)
|
||||
}
|
||||
@ -63,6 +95,8 @@ class NavView : FrameLayout {
|
||||
|
||||
//findViewById<TextView>(R.id.textView).text = "${displayWidth}dp x ${displayHeight}dp"
|
||||
|
||||
// TODO add vars for status/navigation bar background
|
||||
|
||||
bottomAppBar = findViewById(R.id.nv_bottomAppBar)
|
||||
floatingActionButton = findViewById(R.id.nv_floatingActionButton)
|
||||
scrimView = findViewById(R.id.nv_scrim)
|
||||
@ -70,10 +104,24 @@ class NavView : FrameLayout {
|
||||
bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet)
|
||||
|
||||
bottomSheetBehavior.state = STATE_HIDDEN
|
||||
bottomSheetBehavior.peekHeight = displayHeight
|
||||
|
||||
nv_main.setPadding(
|
||||
getLeftInset(nv_main).toInt(),
|
||||
getTopInset(nv_main).toInt(),
|
||||
getRightInset(nv_main).toInt(),
|
||||
getBottomInset(nv_main).toInt()
|
||||
)
|
||||
nv_statusBarBackground.layoutParams.height = getTopInset(nv_main).toInt()
|
||||
nv_navigationBarBackground.layoutParams.height = getBottomInset(nv_main).toInt()
|
||||
|
||||
|
||||
bottomAppBar.setOnTouchListener { v, event ->
|
||||
val location = IntArray(2)
|
||||
bottomSheet.getLocationOnScreen(location)
|
||||
event.setLocation(event.rawX - location[0], event.rawY - location[1])
|
||||
bottomSheet.dispatchTouchEvent(event)
|
||||
false
|
||||
true
|
||||
}
|
||||
|
||||
scrimView.setOnTouchListener { v, event ->
|
||||
@ -89,6 +137,7 @@ class NavView : FrameLayout {
|
||||
if (newState == STATE_HIDDEN && bottomSheetVisible) {
|
||||
bottomSheetVisible = false
|
||||
Anim.fadeOut(scrimView, 300, null)
|
||||
bottomSheet.scrollTo(0, 0)
|
||||
}
|
||||
else if (!bottomSheetVisible) {
|
||||
bottomSheetVisible = true
|
||||
@ -106,15 +155,16 @@ class NavView : FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
nv_elevation.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
|
||||
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
|
||||
textView.text = "Set toolbar elevation ${progress}dp"
|
||||
nv_toolbar.elevation = progress * displayMetrics.density
|
||||
}
|
||||
override fun onStartTrackingTouch(seekBar: SeekBar?) {}
|
||||
override fun onStopTrackingTouch(seekBar: SeekBar?) {}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) {
|
||||
if (contentView == null) {
|
||||
super.addView(child, index, params)
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<merge 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"
|
||||
@ -7,84 +7,119 @@
|
||||
android:orientation="vertical"
|
||||
tools:parentTag="FrameLayout">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
<View
|
||||
android:id="@+id/nv_statusBarBackground"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:elevation="4dp"
|
||||
android:background="?nv_actionBarBackground"
|
||||
app:title="@string/app_name" />
|
||||
android:layout_height="25dp"
|
||||
android:background="?android:windowBackground" />
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
<View
|
||||
android:id="@+id/nv_navigationBarBackground"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
android:layout_height="48dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:background="?colorPrimaryDark"
|
||||
tools:background="?colorPrimaryVariant" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/nv_content"
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/nv_main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginTop="?actionBarSize"
|
||||
android:layout_marginBottom="?actionBarSize"
|
||||
android:orientation="vertical" />
|
||||
android:paddingTop="24dp"
|
||||
android:paddingBottom="48dp">
|
||||
|
||||
<com.google.android.material.bottomappbar.BottomAppBar
|
||||
android:id="@+id/nv_bottomAppBar"
|
||||
style="@style/Widget.MaterialComponents.BottomAppBar.Colored"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
app:fabAlignmentMode="end" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/nv_floatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
app:backgroundTint="?colorAccent"
|
||||
app:layout_anchor="@id/nv_bottomAppBar"
|
||||
tools:srcCompat="@android:drawable/ic_lock_lock" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:translationZ="10dp">
|
||||
|
||||
<View
|
||||
android:id="@+id/nv_scrim"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#99000000"
|
||||
android:visibility="invisible"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/nv_bottomSheet"
|
||||
style="@style/width_max_600dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
app:behavior_hideable="true"
|
||||
app:behavior_peekHeight="500dp"
|
||||
app:layout_behavior="@string/bottom_sheet_behavior">
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/nv_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="?nv_actionBarBackground"
|
||||
android:elevation="4dp"
|
||||
app:title="@string/app_name"
|
||||
tools:targetApi="lollipop" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/nv_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/bottom_sheet_background"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="8dp">
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginTop="?actionBarSize"
|
||||
android:layout_marginBottom="?actionBarSize"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include
|
||||
layout="@layout/bottom_sheet_fragment_theme_info"
|
||||
<SeekBar
|
||||
android:id="@+id/nv_elevation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="24dp"
|
||||
android:max="20"
|
||||
android:progress="4" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Set toolbar elevation" />
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
<com.google.android.material.bottomappbar.BottomAppBar
|
||||
android:id="@+id/nv_bottomAppBar"
|
||||
style="@style/Widget.MaterialComponents.BottomAppBar.Colored"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
app:fabAlignmentMode="end" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/nv_floatingActionButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
app:backgroundTint="?colorAccent"
|
||||
app:layout_anchor="@id/nv_bottomAppBar"
|
||||
tools:srcCompat="@android:drawable/ic_lock_lock" />
|
||||
|
||||
</FrameLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:translationZ="10dp"
|
||||
tools:targetApi="lollipop">
|
||||
|
||||
<View
|
||||
android:id="@+id/nv_scrim"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#99000000"
|
||||
android:visibility="invisible"
|
||||
tools:visibility="gone" />
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/nv_bottomSheet"
|
||||
style="@style/width_max_600dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
app:behavior_hideable="true"
|
||||
app:behavior_peekHeight="auto"
|
||||
app:layout_behavior="@string/bottom_sheet_behavior"
|
||||
tools:visibility="gone">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/bottom_sheet_background"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="8dp">
|
||||
|
||||
<include
|
||||
layout="@layout/bottom_sheet_fragment_theme_info"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
</merge>
|
Loading…
x
Reference in New Issue
Block a user