-1

如何像这样在图像视图上添加阴影效果

图片

如何添加这种类型的 3d 效果我 imageview 任何想法????

<ImageView
     android:id="@+id/test_button_image"
     android:layout_width="fill_parent"
     android:layout_height="200dp"
     android:scaleType="fitXY"
     android:background="@drawable/border6"
     android:src="@drawable/ic_launcher" >
</ImageView>
4

3 回答 3

8

First Step

Create a drawable like below.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item><layer-list>
        <item android:left="3dp" android:top="3dp"><shape>
            <gradient android:angle="270" android:endColor="#E2E2E2" android:startColor="#BABABA" />
            <stroke android:width="3dp" android:color="#BABABA" />

            <corners android:radius="2dp" />

            <padding android:bottom="3dp" android:left="2dp" android:right="3dp" android:top="2dp" />
        </shape></item>
    </layer-list></item>
</selector>

Second Step

Set it as background of ImageView

<ImageView 
    ..
    android:background="@drawable/selected_image_shadow" >
</ImageView>

Output

enter image description here

Left image is without shadow and right image is with shadow.

Note

You need to modify code as per your requirement. This is sample demo with my requirement.

Edit

Use following code to apply reflection effect on image.

public static Bitmap applyReflection(Bitmap originalImage) {
    // gap space between original and reflected
    final int reflectionGap = 4;
    // get image size
    int width = originalImage.getWidth();
    int height = originalImage.getHeight();

    // this will not scale but will flip on the Y axis
    Matrix matrix = new Matrix();
    matrix.preScale(1, -1);

    // create a Bitmap with the flip matrix applied to it.
    // we only want the bottom half of the image
    Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
            height / 2, width, height / 2, matrix, false);

    // create a new bitmap with same width but taller to fit reflection
    Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
            (height + height / 2), Config.ARGB_8888);

    // create a new Canvas with the bitmap that's big enough for
    // the image plus gap plus reflection
    Canvas canvas = new Canvas(bitmapWithReflection);
    // draw in the original image
    canvas.drawBitmap(originalImage, 0, 0, null);
    // draw in the gap
    Paint defaultPaint = new Paint();
    canvas.drawRect(0, height, width, height + reflectionGap, defaultPaint);
    // draw in the reflection
    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

    // create a shader that is a linear gradient that covers the reflection
    Paint paint = new Paint();
    LinearGradient shader = new LinearGradient(0,
            originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
                    + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
    // set the paint to use this shader (linear gradient)
    paint.setShader(shader);
    // set the Transfer mode to be porter duff and destination in
    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
    // draw a rectangle using the paint with our linear gradient
    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
            + reflectionGap, paint);

    return bitmapWithReflection;
}
于 2013-09-03T11:33:12.527 回答
2

你可以在 coverflow 上查看这个开源项目,你可能会得到你需要的东西。

于 2013-09-03T12:20:53.387 回答
0

试试这个在imageview上做镜面反射

public Bitmap getRefelection(Bitmap image) {

// The gap we want between the reflection and the original image

final int reflectionGap = 0;

// Get your bitmap from drawable folder

Bitmap originalImage = image;

int width = originalImage.getWidth();
int height = originalImage.getHeight();

// This will not scale but will flip on the Y axis

Matrix matrix = new Matrix();
matrix.preScale(1, -1);

/*Create a Bitmap with the flip matix applied to it.
We only want the bottom half of the image*/

Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
height / 2, width, height / 2, matrix, false);

// Create a new bitmap with same width but taller to fit reflection

Bitmap bitmapWithReflection = Bitmap.createBitmap(width,(height + height /                  2), Config.ARGB_8888);

// Create a new Canvas with the bitmap that's big enough for
// the image plus gap plus reflection

Canvas canvas = new Canvas(bitmapWithReflection);

// Draw in the original image

canvas.drawBitmap(originalImage, 0, 0, null);

//Draw the reflection Image

canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

// Create a shader that is a linear gradient that covers the reflection

Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,
originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
+ reflectionGap, 0x99ffffff, 0x00ffffff, TileMode.CLAMP);

// Set the paint to use this shader (linear gradient)

paint.setShader(shader);

// Set the Transfer mode to be porter duff and destination in

paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

// Draw a rectangle using the paint with our linear gradient

canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
+ reflectionGap, paint);
if(originalImage!=null && originalImage.isRecycled()){
originalImage.recycle();
originalImage=null;
}
if(reflectionImage!=null && reflectionImage.isRecycled()){
reflectionImage.recycle();
reflectionImage=null;
}
return bitmapWithReflection;
}
}
于 2015-02-14T11:10:03.537 回答