Vérifiez ce projet sur dribbble
Vérifiez ce projet sur Behance
Pour une implémentation fonctionnelle, jetez un œil au module app
Ajoutez-le dans votre racine build.gradle à la fin des référentiels :
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Ajouter la dépendance
dependencies {
implementation 'com.github.Yalantis:Context-Menu.Android:1.1.4'
}
MenuObject
, composée d'une icône ou d'une icône et d'une description. Vous pouvez utiliser n'importe quel drawable, resource, bitmap, color
comme image :
menuObject.drawable = ...
menuObject.setResourceValue(...)
menuObject.setBitmapValue(...)
menuObject.setColorValue(...)
Vous pouvez définir l'image ScaleType
:
menuObject.scaleType = ScaleType.FIT_XY
Vous pouvez utiliser n'importe quelle resource, drawable, color
comme arrière-plan :
menuObject.setBgResourceValue(...)
menuObject.setBgDrawable(...)
menuObject.setBgColorValue(...)
Vous pouvez désormais facilement ajouter un style d'apparence du texte pour les titres de menu :
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
}
Vous pouvez utiliser n’importe quelle color
comme couleur de texte :
menuObject.textColor = ...
Vous pouvez définir n'importe quelle color
comme couleur de séparation :
menuObject.dividerColor = ...
Exemple:
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
de ContextMenuDialogFragment
, qui a reçu l'objet MenuParams
. 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
. 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
}
Pour une meilleure expérience, la taille des éléments de menu doit être égale à la hauteur de ActionBar
.
newInstance
de ContextMenuDialogFragment
reçoit l'objet MenuParams
contenant les champs :
menuObjects
- liste des objets MenuObject,
animationDelay
- délai en millis après l'ouverture du fragment et avant la fermeture, ce qui rendra l'animation plus fluide sur les appareils lents,
animationDuration
- durée de chaque élément d'animation en millis,
isClosableOutside
- si le menu peut être fermé en touchant une zone sans bouton,
isFitSystemWindows
- si vrai, alors l'implémentation par défaut de fitSystemWindows(Rect) sera exécutée,
isClipToPadding
- true pour découper les enfants au remplissage du groupe, false sinon.
Les deux derniers paramètres peuvent être utiles si vous utilisez les paramètres Translucent dans votre thème :
<item name="android:windowTranslucentStatus">true</item>
Pour rester dans Context Menu
sous la barre d'état, définissez fitSystemWindows
sur true et clipToPadding
sur false.
menuObject.textColor
a été corrigértl
gravity
ajouté pour MenuParams
setClosableOutside
.setAnimationDuration
ne fonctionne pas pour les problèmes d'événements ouverts.Usage
.ContextMenuDialogFragment
newInstance
sont obsolètes. Utilisez le nouveau universel reçu MenuParams
.MenuParams.setClosableOutside(boolean)
.MenuObject
. Le paramètre d'image est déplacé vers les méthodesMenuObject
, de l'arrière-plan, de la couleur du texte et de la couleur du séparateur.OnMenuItemLongClickListener
(utilisation : identique à OnMenuItemClickListener
, vérifiez l'exemple d'application) 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(...)
Nous serions très heureux si vous nous envoyiez des liens vers vos projets dans lesquels vous utilisez notre composant. Envoyez simplement un e-mail à [email protected] Et faites-nous savoir si vous avez des questions ou des suggestions concernant l'animation.
PS Nous allons publier plus de merveilles enveloppées dans du code et un tutoriel sur la façon de rendre l'interface utilisateur pour Android (iOS) meilleure que meilleure. Restez à l'écoute!
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.