知是行的主意,行是知的功夫。这篇文章主要讲述从URL设置MenuItem图标 - Android相关的知识,希望能为你提供帮助。
我想在我的ActionBar中设置一个MenuItem,它会导致我的应用程序中的用户个人资料页面。我想要的图标是他的个人资料图片,我有URL,可以创建一个BitMap。
图像不存储在我的项目文件夹中或本地的任何位置,因此我无法从R.drawable中获取它。
有人可以帮我设置一个用URL创建的位图作为MenuItem图标吗?谢谢您的帮助!
答案您可以执行以下操作来设置位图中的图标:
myMenuItem.setIcon(new BitmapDrawable(getResources(), myBitmap));
在你的代码中,这看起来有点像这样:
public boolean onCreateOptionsMenu( Menu menu ) {
MenuInflater inflater = getMenuInflater();
inflater.inflate( R.menu.actionbar, menu );
userItem = menu.findItem(R.id.userItem);
Bitmap myBitmap = //get your bitmap
userItem.setIcon(new BitmapDrawable(getResources(), myBitmap));
return menu;
}
【从URL设置MenuItem图标 - Android】您需要从URL获取文件并首先将其转换为
Bitmap
。请注意,这将很慢,因为如果您在启动应用程序时执行此操作,则用户必须等到文件下载才会显示应用程序。如果您的图标不经常更改,我建议您在设备上缓存它并重新使用本地存储的副本。另请查看“在运行时更改菜单”部分here。
另一答案Kotlin- 毕加索解决方案
扩展功能
fun com.squareup.picasso.Target.picassoLoad(url: String, resources: Resources): com.squareup.picasso.Target {
Picasso.get().load(url)
.resize(resources.getDimension(R.dimen.menuIconSize).toInt(),
resources.getDimension(R.dimen.menuIconSize).toInt())
.into(this)
return this
}
在您的活动中(请注意,您需要对目标工作保持强有力的参考)
private var target : com.squareup.picasso.Target? = nulloverride fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.basemenu, menu)menu.findItem(R.id.menu_you_want)?.let { menuItem ->
target = object : com.squareup.picasso.Target {
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
menuItem.setIcon(R.drawable.fallback_image)
}override fun onBitmapFailed(e: java.lang.Exception?, errorDrawable: Drawable?) {
menuItem.setIcon(R.drawable.fallback_image)
}override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
menuItem.icon = BitmapDrawable(resources, CircleTransform.getCroppedBitmap(bitmap!!))
}}.picassoLoad(url, resources)
}return super.onCreateOptionsMenu(menu)
}
和circletransform类
class CircleTransform : Transformation {
private var x: Int = 0
private var y: Int = 0override fun transform(source: Bitmap): Bitmap {
val size = Math.min(source.width, source.height)x = (source.width - size) / 2
y = (source.height - size) / 2val squaredBitmap = Bitmap.createBitmap(source, x, y, size, size)
if (squaredBitmap !== source) source.recycle()
val bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)
val paint = Paint()
val shader = BitmapShader(squaredBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
paint.shader = shader
paint.isAntiAlias = trueval r = size / 2f
canvas.drawCircle(r, r, r, paint)squaredBitmap.recycle()
return bitmap
}override fun key() = "circle(x=$x,y=$y)"companion object {
fun getCroppedBitmap(bitmap: Bitmap): Bitmap {
val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(output)val color = -0xbdbdbe
val paint = Paint()
val rect = Rect(0, 0, bitmap.width, bitmap.height)paint.isAntiAlias = true
canvas.drawARGB(0, 0, 0, 0)
paint.color = color
canvas.drawCircle(bitmap.width / 2f, bitmap.height / 2f,
bitmap.width / 2f, paint)
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
canvas.drawBitmap(bitmap, rect, rect, paint)
return output
}
}
}
推荐阅读
- 带有ActionBarDrawerToggle的Android菜单
- 如何在Android中更改Action栏的高度()
- Android导航组件“向上按钮”打开抽屉导航
- 如何在android中找到系统Action Bar中存在的不同图标的宽度
- 隐藏Android Action Bar解决方案
- 将android EditText样式从矩形边框更改为下划线
- 在Theme.AppCompat.Light中添加图标
- 如何在Android上将带有文本的向上操作图标更改为按钮()
- 没有ActionBar的Android Activity