Android Paint setShadowLayer()忽略其绘制的颜色
我试图以编程方式创建位图,但发现绘制阴影矩形时忽略了传入的颜色参数。我将事情简化为这种情况-代码只绘制了一个旋转的蓝色正方形,它应该有灰色阴影,但阴影始终是蓝色的:Android Paint setShadowLayer()忽略其绘制的颜色,android,android-canvas,paint,shadow,Android,Android Canvas,Paint,Shadow,我试图以编程方式创建位图,但发现绘制阴影矩形时忽略了传入的颜色参数。我将事情简化为这种情况-代码只绘制了一个旋转的蓝色正方形,它应该有灰色阴影,但阴影始终是蓝色的: main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
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);
}
}
main.xml:
RotateRectShadowActivity.java:
公共类RotateRectShadowActivity扩展活动{
私人线路布置;
私有图像视图mImageView;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
LayoutFlater工厂=LayoutFlater.from(此);
mMainLayout=(LinearLayout)工厂充气(R.layout.main,空);
mImageView=新的图像视图(此);
Rect Rect=新的Rect(0,0,300,300);
位图outerBm=Bitmap.createBitmap(
rect.width()、rect.height()、Bitmap.Config.ARGB_8888);
位图innerBm=Bitmap.createBitmap(
rect.width()-50,rect.height()-50,Bitmap.Config.ARGB_8888);
Canvas outerCanvas=新画布(outerBm);
Canvas innerCanvas=新画布(innerBm);
外罩旋转(3);
矩形左+=25;
rect.top+=25;
右矩形+=25;
矩形底部+=25;
绘制阴影绘制=新绘制();
shadowPaint.setShadowLayer(12,12,12,0xFF555555);
shadowPaint.setColor(0xFF555555);
drawRect(rect,shadowPaint);
绘制矩形绘制=新绘制();
rectPaint.setColor(Color.BLUE);
drawRect(rect,rectPaint);
outerCanvas.drawBitmap(innerBm,0,0,阴影绘制);
设置图像位图(outerBm);
mMainLayout.addView(mImageView);
setContentView(mMainLayout);
}
}
我不明白为什么调用outerCanvas.drawBitmap(innerBm,0,0,shadowPaint);因为我正试图通过innerCanvas在innerBm本身上绘制阴影,但当我传入null时,根本没有阴影。您将内部位图设置得太小,它保留了矩形的边缘。试试这个:
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);
正如附加信息:第二个绘制用于防止在绘制期间分配,这可能会导致延迟(UI线程)等。