Schauen Sie sich dieses Projekt auf dribbble an
Schauen Sie sich dieses Projekt auf Behance an
Eine funktionierende Implementierung finden Sie im app
-Modul
Fügen Sie es in Ihrem Root-build.gradle am Ende der Repositorys hinzu:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Fügen Sie die Abhängigkeit hinzu
dependencies {
implementation 'com.github.Yalantis:Context-Menu.Android:1.1.4'
}
MenuObject
, die aus einem Symbol oder einem Symbol und einer Beschreibung besteht. Sie können jedes drawable, resource, bitmap, color
als Bild verwenden:
menuObject.drawable = ...
menuObject.setResourceValue(...)
menuObject.setBitmapValue(...)
menuObject.setColorValue(...)
Sie können ScaleType
des Bildes festlegen:
menuObject.scaleType = ScaleType.FIT_XY
Sie können jede resource, drawable, color
als Hintergrund verwenden:
menuObject.setBgResourceValue(...)
menuObject.setBgDrawable(...)
menuObject.setBgColorValue(...)
Jetzt können Sie ganz einfach Textdarstellungsstile für Menütitel hinzufügen:
In your project styles create style for text appearance
(For better visual effect extend it from TextView.DefaultStyle):
<style name="TextViewStyle" parent="TextView.DefaultStyle">
<item name="android:textStyle">italic|bold</item>
<item name="android:textColor">#26D0EB</item>
</style>
And set it's id to your MenuObject :
val bitmapDrawable = BitmapDrawable(
resources,
BitmapFactory.decodeResource(resources, R.drawable.icn_3)
)
val menuObject = MenuObject("Add to friends").apply {
drawable = bitmapDrawable
menuTextAppearanceStyle = R.style.TextViewStyle
}
Als Textfarbe können Sie jede beliebige color
verwenden:
menuObject.textColor = ...
Sie können eine beliebige color
als Trennfarbe festlegen:
menuObject.dividerColor = ...
Beispiel:
val close = MenuObject().apply { setResourceValue(R.drawable.icn_close) }
val send = MenuObject("Send message").apply { setResourceValue(R.drawable.icn_1) }
val addFriend = MenuObject("Add to friends").apply {
drawable = BitmapDrawable(
resources,
BitmapFactory.decodeResource(resources, R.drawable.icn_3)
)
}
val menuObjects = mutableListOf<MenuObject>().apply {
add(close)
add(send)
add(addFriend)
}
newInstance
von ContextMenuDialogFragment
, die MenuParams
Objekt erhalten hat. val menuParams = MenuParams(
actionBarSize = resources.getDimension(R.dimen.tool_bar_height).toInt(),
menuObjects = getMenuObjects(),
isClosableOutside = false
// set other settings to meet your needs
)
// If you want to change the side you need to add 'gravity' parameter,
// by default it is MenuGravity.END.
// For example:
val menuParams = MenuParams(
actionBarSize = resources.getDimension(R.dimen.tool_bar_height).toInt(),
menuObjects = getMenuObjects(),
isClosableOutside = false,
gravity = MenuGravity.START
)
val contextMenuDialogFragment = ContextMenuDialogFragment.newInstance(menuParams)
ContextMenuDialogFragment
geöffnet wird. override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
item?.let {
when (it.itemId) {
R.id.context_menu -> {
showContextMenuDialogFragment()
}
}
}
return super.onOptionsItemSelected(item)
}
contextMenuDialogFragment = menuItemClickListener = { view, position ->
// do something here
}
contextMenuDialogFragment = menuItemLongClickListener = { view, position ->
// do something here
}
Für ein besseres Erlebnis sollte die Größe des Menüelements der Höhe ActionBar
entsprechen.
newInstance
of ContextMenuDialogFragment
empfängt MenuParams
Objekt mit den folgenden Feldern:
menuObjects
– Liste der MenuObject-Objekte,
animationDelay
– Verzögerung in Millisekunden nach dem Öffnen des Fragments und vor dem Schließen, wodurch die Animation auf langsamen Geräten flüssiger wird.
animationDuration
– Dauer jedes Animationsteils in Millisekunden,
isClosableOutside
– wenn das Menü bei Berührung eines Nicht-Schaltflächenbereichs geschlossen werden kann,
isFitSystemWindows
– wenn true, dann wird die Standardimplementierung von fitSystemWindows(Rect) ausgeführt,
isClipToPadding
– true, um untergeordnete Elemente auf den Abstand der Gruppe zu beschränken, andernfalls false.
Die letzten beiden Parameter können nützlich sein, wenn Sie in Ihrem Theme Translucent -Parameter verwenden:
<item name="android:windowTranslucentStatus">true</item>
Damit Context Menu
unter der Statusleiste bleibt, setzen Sie fitSystemWindows
auf true und clipToPadding
auf false.
menuObject.textColor
wurde behobenrtl
Unterstützung hinzugefügtgravity
für MenuParams
hinzugefügtsetClosableOutside
Problem wurde behoben.setAnimationDuration
funktioniert bei Problemen mit offenen Ereignissen nicht.Usage
.ContextMenuDialogFragment
newInstance
sind veraltet. Verwenden Sie ein neues universelles, das MenuParams
erhalten hat.MenuParams.setClosableOutside(boolean)
.MenuObject
-Konstruktoren. Die Bildeinstellung wurde in die Methoden verschobenMenuObject
-Bild, Hintergrund, Textfarbe und Trennerfarbe hinzugefügtOnMenuItemLongClickListener
hinzugefügt (Verwendung: die gleiche wie OnMenuItemClickListener
, Beispiel-App prüfen) com.yalantis.contextmenu.lib.ContextMenuDialogFragment.ItemClickListener ->
com.yalantis.contextmenu.lib.interfaces.OnMenuItemClickListener
com.yalantis.contextmenu.lib.ContextMenuDialogFragment.ItemClickListener.onItemClick(...) ->
com.yalantis.contextmenu.lib.interfaces.OnMenuItemClickListener.onMenuItemClick(...)
Wir würden uns sehr freuen, wenn Sie uns Links zu Ihren Projekten senden, in denen Sie unsere Komponente einsetzen. Senden Sie einfach eine E-Mail an [email protected]. Teilen Sie uns mit, wenn Sie Fragen oder Vorschläge zur Animation haben.
PS: Wir werden noch mehr Großartiges in Code und ein Tutorial veröffentlichen, wie man die Benutzeroberfläche für Android (iOS) besser als besser macht. Bleiben Sie dran!
Copyright 2019, Yalantis
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.