具有投影效果的自定义ImageView

99

好的,我已经阅读并搜索了很多内容,现在正在努力地尝试解决这个问题。以下是我目前掌握的:

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”只是临时的;据我所知,我需要进行一些数学计算来确定阴影对画布的实际大小产生了多大的影响,对吗?

但当我使用以下代码:

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频道中与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);       
}

"现在它可以处理普通矩形图像了" ... 所以它不能处理非矩形图像,我假设它也不能处理9patch图像,对吗?你现在解决了吗?因为Romain Guy的这种方法在我的测试中还没有生效。 - Mathias Conradt
嗯,有趣的问题。我认为你可能可以将使用9-patch的View包装在FrameLayout中,并给FrameLayout添加下拉阴影9-patch背景。但是,它只适用于矩形图像,因为没有办法让9-patch遵循透明度轮廓。不幸的是,我还没有找到更好的解决方案,但是自那以后我也没有再尝试过。 - Kevin Coppock
11个回答

-2

如果你想使用自定义的imageView,我建议你使用这个

视图看起来完美,不需要使用任何九宫格图片。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接