【问题标题】:how to add 3d effect on imageview如何在 imageview 上添加 3d 效果
【发布时间】:2015-02-14 19:10:03
【问题描述】:

如何在 imageview 上添加阴影效果,就像这个 shreen shot

如何添加这种类型的 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>

【问题讨论】:

  • 你试过什么?仅仅创建一个 imageView 实际上并不接近你想要的。

标签: android canvas imageview effect


【解决方案1】:

第一步

创建一个像下面这样的drawable。

<?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>

第二步

设置为ImageView的背景

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

输出

左图没有阴影,右图有阴影。

注意

您需要根据您的要求修改代码。这是符合我要求的示例演示。

编辑

使用以下代码对图像应用反射效果。

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;
}

【讨论】:

  • 我尝试了我的一个应用程序。它怎么没有任何影响..?请查看我编辑的输出..
  • 我不想要灰色的阴影我想要像我的截图一样在底部的镜像
【解决方案2】:

你可以查看这个open source project on coverflow,你可能会得到你需要的。

【讨论】:

    【解决方案3】:

    试试这个在 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;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2016-07-21
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多