android - 带有阴影的自定义 ImageView

好的,我一直在阅读和搜索,现在我正用头撞墙试图弄清楚这一点。到目前为止,这是我所拥有的:

package com.pockdroid.sandbox;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.widget.ImageView;

public class ShadowImageView extends ImageView {

private Rect mRect;
private Paint mPaint;

public ShadowImageView(Context context)
{
    super(context);
    mRect = new Rect();
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setShadowLayer(2f, 1f, 1f, Color.BLACK);
}

@Override
protected void onDraw(Canvas canvas) 
{
    Rect r = mRect;
    Paint paint = mPaint;

    canvas.drawRect(r, paint);
    super.onDraw(canvas);
}

@Override
protected void onMeasure(int w, int h)
{
    super.onMeasure(w,h);
    int mH, mW;
    mW = getSuggestedMinimumWidth() < getMeasuredWidth()? getMeasuredWidth() : getSuggestedMinimumWidth();
    mH = getSuggestedMinimumHeight() < getMeasuredHeight()? getMeasuredHeight() : getSuggestedMinimumHeight();
    setMeasuredDimension(mW + 5, mH + 5);
}

}

测量中的“+5”是暂时的;据我了解,我需要做一些数学运算来确定阴影添加到 Canvas 的大小,对吧?

但是当我使用这个时:

public View getView(int position, View convertView, ViewGroup parent) {
    ShadowImageView sImageView;
    if (convertView == null) {
        sImageView = new ShadowImageView(mContext);
        GridView.LayoutParams lp = new GridView.LayoutParams(85, 85);
        sImageView.setLayoutParams(lp);

        sImageView.setScaleType(ImageView.ScaleType.CENTER);
        sImageView.setPadding(5,5,5,5);
    } else {
        sImageView = (ShadowImageView) convertView;
    }

    sImageView.setImageBitmap(bitmapList.get(position));
    return sImageView;
}

在我的 ImageView 中,当我运行程序时,我仍然得到一个普通的 ImageView。

有什么想法吗?谢谢。

编辑:所以我在 IRC channel 中与 RomainGuy 进行了交谈,我现在使用以下代码处理普通矩形图像。不过,它仍然不会将阴影直接绘制到我的位图透明度上,所以我仍在努力。

@Override
protected void onDraw(Canvas canvas) 
{
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.omen);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
    canvas.drawColor(Color.GRAY);
    canvas.drawRect(50, 50, 50 + bmp.getWidth(), 50 + bmp.getHeight(), paint);
    canvas.drawBitmap(bmp, 50, 50, null);       
}

最佳答案

好的,我预计这个问题不会有更多答案,所以我现在最终选择的只是矩形图像的解决方案。我使用了以下 NinePatch:



以及适当的 XML 填充:

<ImageView
        android:id="@+id/image_test"
        android:background="@drawable/drop_shadow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="6px"
        android:paddingTop="4px"
        android:paddingRight="8px"
        android:paddingBottom="9px"
        android:src="@drawable/pic1"
        />

要获得相当好的结果:



不理想,但可以。

https://stackoverflow.com/questions/3693234/

相关文章:

android - 是否可以更改android单选按钮组中的单选按钮图标

android - 带有完成操作按钮的多行 EditText

android - SearchView 的 OnCloseListener 不起作用

android - ListView addHeaderView 导致位置加一?

android - 从 android 图库中选择多张图片

android - ViewPager.setOffscreenPageLimit(0) 无法按预期

android - 如何将值从一个 Activity 传递到上一个 Activity

android - 清算 Intent

android - post方法到底是做什么的?

android - 如何调试签署发布的apk?