Mira este proyecto en dribbble
Mira este proyecto en Behance
Para una implementación funcional, eche un vistazo al módulo app
.
Agréguelo en su build.gradle raíz al final de los repositorios:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Agregar la dependencia
dependencies {
implementation 'com.github.Yalantis:Context-Menu.Android:1.1.4'
}
MenuObject
, que consta de icono o icono y descripción. Puede utilizar cualquier drawable, resource, bitmap, color
como imagen:
menuObject.drawable = ...
menuObject.setResourceValue(...)
menuObject.setBitmapValue(...)
menuObject.setColorValue(...)
Puede configurar ScaleType
de imagen:
menuObject.scaleType = ScaleType.FIT_XY
Puedes utilizar cualquier resource, drawable, color
como fondo:
menuObject.setBgResourceValue(...)
menuObject.setBgDrawable(...)
menuObject.setBgColorValue(...)
Ahora puedes agregar fácilmente un estilo de apariencia de texto para los títulos de los menús:
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
}
Puedes usar cualquier color
como color de texto:
menuObject.textColor = ...
Puede configurar cualquier color
como color divisor:
menuObject.dividerColor = ...
Ejemplo:
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
, que recibió el objeto 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
}
Para una mejor experiencia, el tamaño del elemento del menú debe ser igual a la altura de ActionBar
.
newInstance
de ContextMenuDialogFragment
recibe el objeto MenuParams
que tiene los campos:
menuObjects
: lista de objetos MenuObject,
animationDelay
: retraso en milisegundos después de la apertura del fragmento y antes del cierre, lo que hará que la animación sea más fluida en dispositivos lentos.
animationDuration
: duración de cada parte de la animación en milisegundos.
isClosableOutside
: si el menú se puede cerrar al tocar un área sin botones,
isFitSystemWindows
: si es verdadero, se ejecutará la implementación predeterminada de fitSystemWindows(Rect).
isClipToPadding
: verdadero para recortar elementos secundarios al relleno del grupo; en caso contrario, falso.
Los dos últimos parámetros pueden ser útiles si usa parámetros Translúcidos en su tema:
<item name="android:windowTranslucentStatus">true</item>
Para permanecer en Context Menu
debajo de la barra de estado, configure fitSystemWindows
en verdadero y clipToPadding
en falso.
menuObject.textColor
rtl
añadidogravity
agregado para MenuParams
setClosableOutside
.setAnimationDuration
no funciona para un problema de evento abierto.Usage
.ContextMenuDialogFragment
newInstance
están en desuso. Utilice uno nuevo universal que recibió MenuParams
.MenuParams.setClosableOutside(boolean)
.MenuObject
. La configuración de imagen se mueve a métodosMenuObject
, el fondo, el color del texto y el color del divisor.OnMenuItemLongClickListener
(uso: igual que OnMenuItemClickListener
, verifique la aplicación de muestra) 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(...)
Estaríamos muy contentos si nos enviara enlaces a sus proyectos en los que utiliza nuestro componente. Simplemente envíe un correo electrónico a [email protected] y háganos saber si tiene alguna pregunta o sugerencia sobre la animación.
PD: Vamos a publicar más maravillas envueltas en código y un tutorial sobre cómo hacer que la interfaz de usuario para Android (iOS) sea mejor que mejor. ¡Manténganse al tanto!
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.