【问题标题】:Android Paint setShadowLayer() ignores color of its PaintAndroid Paint setShadowLayer() 忽略其 Paint 的颜色
【发布时间】:2011-08-29 12:50:27
【问题描述】:

我正在尝试以编程方式创建位图,但发现绘制阴影矩形忽略了传入的颜色参数。我已将事情简化为这种情况 - 代码只是绘制了一个旋转的蓝色正方形,它应该有一个灰色的阴影,但阴影总是蓝色的:

main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff"
    android:padding="40dp"
    >
</LinearLayout>

RotateRectShadowActivity.java:
public class RotateRectShadowActivity extends Activity {
    private LinearLayout mMainLayout;
    private ImageView mImageView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LayoutInflater factory = LayoutInflater.from( this );
        mMainLayout = (LinearLayout) factory.inflate( R.layout.main, null );

        mImageView = new ImageView(this);

        Rect rect = new Rect(0, 0, 300, 300);

        Bitmap outerBm = Bitmap.createBitmap(
                rect.width(), rect.height(), Bitmap.Config.ARGB_8888);
        Bitmap innerBm = Bitmap.createBitmap(
                rect.width()-50, rect.height()-50, Bitmap.Config.ARGB_8888);

        Canvas outerCanvas = new Canvas(outerBm);
        Canvas innerCanvas = new Canvas(innerBm);
        outerCanvas.rotate(3);

        rect.left += 25;
        rect.top += 25;
        rect.right += 25;
        rect.bottom += 25;

        Paint shadowPaint = new Paint();
        shadowPaint.setShadowLayer(12, 12, 12, 0xFF555555);
        shadowPaint.setColor(0xFF555555);

        innerCanvas.drawRect(rect, shadowPaint);

        Paint rectPaint = new Paint();
        rectPaint.setColor(Color.BLUE);
        innerCanvas.drawRect(rect, rectPaint);
        outerCanvas.drawBitmap(innerBm, 0, 0, shadowPaint);

        mImageView.setImageBitmap(outerBm);
        mMainLayout.addView(mImageView);
        setContentView(mMainLayout);
    }
}

我不明白为什么调用 outerCanvas.drawBitmap(innerBm, 0, 0, shadowPaint);根本需要 Paint,因为我试图通过 innerCanvas 在 innerBm 本身上绘制阴影,但是当我传入 null 时根本没有阴影。

【问题讨论】:

  • 正如附加信息:第二个 Paint 用于防止在绘制期间分配可能导致滞后(UI 线程)等。

标签: android android-canvas paint shadow


【解决方案1】:

你的内部位图太小了,它会影响矩形的边缘。试试这个:

    Bitmap outerBm = Bitmap.createBitmap( 
            rect.width(), rect.height(), Bitmap.Config.ARGB_8888); 
    Bitmap innerBm = Bitmap.createBitmap( 
            rect.width() + 50, rect.height() + 50, Bitmap.Config.ARGB_8888); 

    Canvas outerCanvas = new Canvas(outerBm); 
    Canvas innerCanvas = new Canvas(innerBm); 
    outerCanvas.rotate(3); 

    rect.left += 25; 
    rect.top += 25; 
    rect.right -= 25; 
    rect.bottom -= 25; 

    Paint shadowPaint = new Paint();
    shadowPaint.setColor(Color.BLUE);; 
    shadowPaint.setShadowLayer(12, 12, 12, 0xFF555555); 

    innerCanvas.drawRect(rect, shadowPaint); 

    outerCanvas.drawBitmap(innerBm, 0, 0, null); 

【讨论】:

    猜你喜欢
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2012-05-16
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多