Run*_*oop 13 android android-canvas
我目前通过绘制到画布在我的应用程序中创建一个圆形版本的图像.我想在图像周围画一个微弱的outershadow,但我不能完全正确.我有两个问题:1.如何绘制外部阴影(我似乎只能用ax或y偏移绘制阴影)2.如何绘制阴影,使其没有附加图像中显示的瑕疵.码:
![public Bitmap getRoundedCornerBitmap(Bitmap bitmap, float cornerRadius) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth()+6, bitmap.getHeight() +6, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
int shadowRadius = getDipsFromPixel(3);
final Rect imageRect = new Rect(shadowRadius, shadowRadius, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(imageRect);
// This does not achieve the desired effect
Paint shadowPaint = new Paint();
shadowPaint.setAntiAlias(true);
shadowPaint.setColor(Color.BLACK);
shadowPaint.setShadowLayer((float)shadowRadius, 2.0f, 2.0f,Color.BLACK);
canvas.drawOval(rectF, shadowPaint);
canvas.drawARGB(0, 0, 0, 0);
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(color);
canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, imageRect, imageRect, paint);
return output;
}][1]
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的效果的一个例子:

Nat*_*ann 30
我想要一个类似的效果,但在AppWidget上,不幸的是我无法使用@ EvelioTarazona的解决方案.这就是我提出的,它应该适用于任何形状的位图.
final Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
final Bitmap shadow = addShadow(src, src.getHeight(), src.getWidth(), Color.BLACK, 3, 1, 3);
final ImageView iv = (ImageView)findViewById(R.id.image);
iv.setImageBitmap(shadow);
Run Code Online (Sandbox Code Playgroud)

public Bitmap addShadow(final Bitmap bm, final int dstHeight, final int dstWidth, int color, int size, float dx, float dy) {
final Bitmap mask = Bitmap.createBitmap(dstWidth, dstHeight, Config.ALPHA_8);
final Matrix scaleToFit = new Matrix();
final RectF src = new RectF(0, 0, bm.getWidth(), bm.getHeight());
final RectF dst = new RectF(0, 0, dstWidth - dx, dstHeight - dy);
scaleToFit.setRectToRect(src, dst, ScaleToFit.CENTER);
final Matrix dropShadow = new Matrix(scaleToFit);
dropShadow.postTranslate(dx, dy);
final Canvas maskCanvas = new Canvas(mask);
final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
maskCanvas.drawBitmap(bm, scaleToFit, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
maskCanvas.drawBitmap(bm, dropShadow, paint);
final BlurMaskFilter filter = new BlurMaskFilter(size, Blur.NORMAL);
paint.reset();
paint.setAntiAlias(true);
paint.setColor(color);
paint.setMaskFilter(filter);
paint.setFilterBitmap(true);
final Bitmap ret = Bitmap.createBitmap(dstWidth, dstHeight, Config.ARGB_8888);
final Canvas retCanvas = new Canvas(ret);
retCanvas.drawBitmap(mask, 0, 0, paint);
retCanvas.drawBitmap(bm, scaleToFit, null);
mask.recycle();
return ret;
}
Run Code Online (Sandbox Code Playgroud)
eve*_*otc 14
开始了
是的,我还在挖掘Nexus S.
首先,请停止屏蔽位图是这样,你可以做到这一点不分配另一个Bitmap,结帐这个博客帖子有关如何绘制圆角(实际上任何形状)的图像.
第二次使用Drawable你可能会弄清楚如何添加你的阴影,只是确保它不会被剪裁,在18岁以上你可以使用ViewOverlays,同时请记住,硬件加速层有几个不受支持的绘图操作,包括setShadowLayer和BlurMaskFilter,如果性能是不是你的问题,你可以一如既往禁用它:
if (SDK_INT >= HONEYCOMB) {
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
Run Code Online (Sandbox Code Playgroud)
并setShadowLayer按照您的尝试使用:
somePaint.setShadowLayer(shadowSize, deltaX, deltaY, shadowColor);
Run Code Online (Sandbox Code Playgroud)
有关示例,请查看最后的链接.
如果你仍然想要硬件加速,你将不得不伪装它有过度绘制的风险,你可以使用径向渐变或绘制另一个椭圆模糊它(如前所述不能使用BlurMaskFilter)或使用预模糊Bitmap(更多掩蔽) ).
对于这样一个微妙的阴影,如果需要性能,我宁愿只是平放,完整的酱汁在香蕉架上.
更新:从L开始,您可以使用真实阴影.
ImageView imageView=findViewById(R.id.iv);
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.images);
imageView.setImageBitmap(doHighlightImage(icon));
public static Bitmap doHighlightImage(Bitmap src) {
Bitmap bmOut = Bitmap.createBitmap(src.getWidth() + 96, src.getHeight() + 96, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmOut);
canvas.drawColor(0, Mode.CLEAR);
Paint ptBlur = new Paint();
ptBlur.setMaskFilter(new BlurMaskFilter(15, BlurMaskFilter.Blur.NORMAL));
int[] offsetXY = new int[2];
Bitmap bmAlpha = src.extractAlpha(ptBlur, offsetXY);
Paint ptAlphaColor = new Paint();
ptAlphaColor.setColor(Color.BLACK);
canvas.drawBitmap(bmAlpha, offsetXY[0], offsetXY[1], ptAlphaColor);
bmAlpha.recycle();
canvas.drawBitmap(src, 0, 0, null);
return bmOut;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20816 次 |
| 最近记录: |