Android开发-Android中设置图片为圆角,Drawable转化为Bitmap

本文介绍了一个Android工具类,提供了图片缩放、Drawable转Bitmap、圆角图片和带倒影图片的生成功能,通过实际代码示例展示了如何在Android应用中使用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 简介

图片处理是Android应用程序开发时经常需要进行的操作,例如图片的放大,缩小,拉升,圆角,倒影.......等等。

Android中,和图片相关的类,最主要的两个是Drawable转化为Bitmap。经常需要进行二者的转换。本篇介绍,图片相关的操作,给出一个工具类的实现。

2 工具类的实现和使用:

这个工具类主要提供以下功能:

图片的缩放(缩小和放大);
把Drawable转化为Bitmap;
通过Bitmap,获得圆角图片;
通过Bitmap,获得带倒影的图片;

代码:

package com.bangcle.myglibtestapp.utils;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.Drawable;
public class ImageTools {

    //放大缩小图片
    public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Matrix matrix = new Matrix();
        float scaleWidht = ((float)w / width);
        float scaleHeight = ((float)h / height);
        matrix.postScale(scaleWidht, scaleHeight);
        Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        return newbmp;
    }
    //将Drawable转化为Bitmap
    public static Bitmap drawableToBitmap(Drawable drawable){
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        Bitmap bitmap = Bitmap.createBitmap(width, height,
                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                        : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0,0,width,height);
        drawable.draw(canvas);
        return bitmap;

    }

    //获得圆角图片的方法
    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){

        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return output;
    }
    //获得带倒影的图片方法
    public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){
        final int reflectionGap = 4;
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

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

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

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

        Canvas canvas = new Canvas(bitmapWithReflection);
        canvas.drawBitmap(bitmap, 0, 0, null);
        Paint deafalutPaint = new Paint();
        canvas.drawRect(0, height,width,height + reflectionGap,
                deafalutPaint);

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

        Paint paint = new Paint();
        LinearGradient shader = new LinearGradient(0,
                bitmap.getHeight(), 0, bitmapWithReflection.getHeight()
                + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
        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;
    }

}

说明:

Bitmap.createBitmap: 创建Bitemap对象;
bitmap.getWidth()/getHeight():获取宽高;
Rect rect = new Rect():创建一个矩形框;

工具类的使用:

package com.bangcle.myglibtestapp;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;

import androidx.core.content.ContextCompat;

import com.bangcle.myglibtestapp.utils.ImageTools;

public class MainActivity extends Activity {
    private ImageView mImageView01,mImageView02;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_test);
        setupViews();
    }

    private void setupViews(){
        mImageView01 = (ImageView)findViewById(R.id.image01);
        mImageView02 = (ImageView)findViewById(R.id.image02);

        //从文件实例化Drawable对象
        Drawable drawable = ContextCompat.getDrawable(this, R.drawable.dongwu_image01);

        //将Drawable转化为Bitmap
        Bitmap bitmap = ImageTools.drawableToBitmap(drawable);
        //缩放图片
        Bitmap zoomBitmap = ImageTools.zoomBitmap(bitmap, 100, 100);
        //获取圆角图片
        Bitmap roundBitmap = ImageTools.getRoundedCornerBitmap(zoomBitmap, 10.0f);
        //获取倒影图片
        Bitmap reflectBitmap = ImageTools.createReflectionImageWithOrigin(zoomBitmap);
        //这里可以让Bitmap再转化为Drawable
//    	Drawable roundDrawable = new BitmapDrawable(roundBitmap);
//    	Drawable reflectDrawable = new BitmapDrawable(reflectBitmap);
//    	mImageView01.setBackgroundDrawable(roundDrawable);
//    	mImageView02.setBackgroundDrawable(reflectDrawable);

        mImageView01.setImageBitmap(roundBitmap);
        mImageView02.setImageBitmap(reflectBitmap);
    }


}

说明:

通过dongwu_image01.png文件,创建一个Drawable对象:

Drawable drawable = ContextCompat.getDrawable(this, R.drawable.dongwu_image01);:

将drawable转换为bitmap:

ImageTools.drawableToBitmap(drawable);

按照100%缩放图片:

ImageTools.zoomBitmap(bitmap, 100, 100);

布局文件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"
    >
    <ImageView
        android:id="@+id/image01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10px"
        />
    <ImageView
        android:id="@+id/image02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10px"
        />
</LinearLayout>

运行效果图:

说明:

上面的控件是圆角,下面的是直角。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值