`
桥下一粒砂
  • 浏览: 209117 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【Android】图片切角,切指定的边。

阅读更多

公司的项目,UI和应用都是我自己做的。前几天设计了一个UI,出现了半边圆角的情况,如下图片所示。图片都来自服务器,肯定不能要求返回的图片按这个格式,必须在应用端对图片进行切角。



Google了好久,发现能找到的代码都是重复的,而且代码垃圾很多。于是按着那段代码的解决方式,自己写了一个实现指定切某一边的工具类。

直接可用的代码:

package com.lurencun.androidsysteminfomation;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;

/**
 * @author : 桥下一粒砂
 * @email  : chenyoca@gmail.com
 * @date   : 2012-11-8
 * @desc   : 
 */
public class BitmapFillet {

	public static final int ALL = 347120;
    public static final int TOP = 547120;
    public static final int LEFT = 647120;
    public static final int RIGHT = 747120;
    public static final int BOTTOM = 847120;
    
    /**
     * 
     * 指定图片的切边,对图片进行圆角处理
     * @param type 具体参见:{@link BitmapFillet.ALL} , {@link BitmapFillet.TOP} , 
     * 				{@link BitmapFillet.LEFT} , {@link BitmapFillet.RIGHT} , {@link BitmapFillet.BOTTOM}
     * @param bitmap 需要被切圆角的图片
     * @param roundPx 要切的像素大小
     * @return
     *
     */
    public static Bitmap fillet(int type,Bitmap bitmap,int roundPx) {
        try {
        	// 其原理就是:先建立一个与图片大小相同的透明的Bitmap画板
        	// 然后在画板上画出一个想要的形状的区域。
        	// 最后把源图片帖上。
        	final int width = bitmap.getWidth();
        	final int height = bitmap.getHeight();
        	
            Bitmap paintingBoard = Bitmap.createBitmap(width,height, Config.ARGB_8888);
            Canvas canvas = new Canvas(paintingBoard);
            canvas.drawARGB(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT);
            
            final Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setColor(Color.BLACK);   
            
            if( TOP == type ){
            	clipTop(canvas,paint,roundPx,width,height);
            }else if( LEFT == type ){
            	 clipLeft(canvas,paint,roundPx,width,height);
            }else if( RIGHT == type ){
            	clipRight(canvas,paint,roundPx,width,height);
            }else if( BOTTOM == type ){
            	clipBottom(canvas,paint,roundPx,width,height);
            }else{
            	clipAll(canvas,paint,roundPx,width,height);
            }
            
            paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
            //帖子图
            final Rect src = new Rect(0, 0, width, height);
            final Rect dst = src;
            canvas.drawBitmap(bitmap, src, dst, paint);   
            return paintingBoard;
        } catch (Exception exp) {        
            return bitmap;
        }
    }
    
    private static void clipLeft(final Canvas canvas,final Paint paint,int offset,int width,int height){
        final Rect block = new Rect(offset,0,width,height);
        canvas.drawRect(block, paint);
        final RectF rectF = new RectF(0, 0, offset * 2 , height);
        canvas.drawRoundRect(rectF, offset, offset, paint);
    }
    
    private static void clipRight(final Canvas canvas,final Paint paint,int offset,int width,int height){
        final Rect block = new Rect(0, 0, width-offset, height);
        canvas.drawRect(block, paint);
        final RectF rectF = new RectF(width - offset * 2, 0, width , height);
        canvas.drawRoundRect(rectF, offset, offset, paint);
    }
    
    private static void clipTop(final Canvas canvas,final Paint paint,int offset,int width,int height){
        final Rect block = new Rect(0, offset, width, height);
        canvas.drawRect(block, paint);
        final RectF rectF = new RectF(0, 0, width , offset * 2);
        canvas.drawRoundRect(rectF, offset, offset, paint);
    }
    
    private static void clipBottom(final Canvas canvas,final Paint paint,int offset,int width,int height){
        final Rect block = new Rect(0, 0, width, height - offset);
        canvas.drawRect(block, paint);
        final RectF rectF = new RectF(0, height - offset * 2 , width , height);
        canvas.drawRoundRect(rectF, offset, offset, paint);
    }
    
    private static void clipAll(final Canvas canvas,final Paint paint,int offset,int width,int height){
    	final RectF rectF = new RectF(0, 0, width , height);
        canvas.drawRoundRect(rectF, offset, offset, paint);
    }
}

  • 大小: 59.1 KB
1
0
分享到:
评论
1 楼 guanting207 2015-07-01  
图片显示限制了大小,为了正常显示,我加了scaletype=centercrop,这样大图的圆角就显示不出来了,不知道楼主有没有遇见这个问题,求指教。357553873

相关推荐

    android从指定文件夹中显示图片

    在Android平台上,从指定文件夹显示图片涉及到一系列的步骤和技术,包括文件系统操作、图片加载库的使用以及UI设计。以下是对这个主题的详细讲解: 首先,我们需要理解Android的文件系统结构。Android设备通常有两...

    android图片或拍照选取指定区域的 完美解决方案

    综上所述,Android中实现"拍照或选取指定区域的图片"的完美解决方案,主要涉及以下几个步骤:引入`CropImage`库,设置相机和相册权限,启动相机或相册选取图片,调用裁剪接口,以及处理裁剪结果。通过这个方案,...

    android 在imageview上的指定位置添加图片 图片尺寸自适应

    综上所述,要在Android的ImageView上指定位置添加图片,并实现等比例缩放和自适应,我们需要对Android的视图布局、ImageView的ScaleType、Bitmap的缩放以及适应不同屏幕尺寸有深入理解。通过以上代码示例,我们可以...

    android查找指定目录下的视频或图片

    总之,实现“android查找指定目录下的视频或图片”这一功能,需要熟悉Android的文件系统、MediaStore API、ContentResolver以及UI设计。在实践中,还应注意性能优化、权限管理和错误处理,确保应用的稳定性和易用性...

    Android 完美实现图片圆角和圆形

    在Android开发中,有时我们需要对显示的图片进行特殊处理,比如让图片呈现圆角或完全圆形。本知识点将深入探讨如何在Android应用中完美实现图片的圆角和圆形效果。 首先,我们来看如何实现图片的圆角效果。Android...

    android图片上添加文字

    在Android开发中,将文字添加到图片上的需求十分常见,比如在地图应用中进行位置标注、制作信息图或者个性化头像等。以下是一些关于如何在Android图片上添加文字的关键知识点: 1. **画布与Bitmap**: 在Android中,...

    最全的android图片加密

    在Android平台上,保护用户的隐私数据,尤其是敏感的图片信息,是一项重要的任务。本文将深入探讨如何实现Android图片的加密和解密,主要关注国际标准的AES(Advanced Encryption Standard)加密和混入字节加密这两...

    Android图片裁剪----移动、缩放图片进行裁剪

    在Android开发中,图片裁剪是一项常见的功能,广泛应用于各种应用程序,如社交应用中的头像设置、拍照应用的编辑功能等。本知识点将详细介绍如何在Android中实现图片的移动和缩放裁剪。 首先,我们需要了解Android...

    android多张图片展示

    通过创建一个意图,设置其动作为`ACTION_PICK`,并指定类型为图片(`"image/*"`),可以打开系统的图库应用,让用户选择图片。 - 为了支持多选,我们需要使用第三方库,如`com.github.chrisbanes:PhotoPicker`或`...

    android图片缩放放大

    在Android开发中,图片的缩放和放大是一个常见的需求,特别是在设计用户界面或者处理图像时。这个"android图片缩放、放大demo"可能是提供了一个实际的项目实例,用于展示如何在Android应用程序中实现图片的动态调整...

    android图片处理集合demo

    在Android开发中,图片处理是一项常见的任务,涉及到用户体验和应用性能。"android图片处理集合demo"是一个示例项目,集中展示了多种图片处理技术。虽然代码可能没有经过精心整理,但仍然能为开发者提供宝贵的参考。...

    android地图定位到指定坐标

    本项目实现了“android地图定位到指定坐标”,使用了百度地图API,允许用户手动将地图中心点移动到特定地理位置。 首先,要实现地图功能,我们需要在AndroidManifest.xml文件中添加必要的权限,包括访问网络、读取...

    Android实现WebView图片缓存,替换加载前默认图片的样式

    通过以上步骤,我们就成功地实现了在Android的WebView中进行图片缓存、替换加载前的默认图片样式以及图片点击事件的处理。这不仅提升了用户体验,还能有效地减少网络资源的消耗。同时,这些技术也可以作为基础,...

    Android调用手机拍照,将拍照的图片放在指定文件夹中

    // 图片已经保存在指定的文件中,可以进行处理 // ... } catch (Exception e) { e.printStackTrace(); } } } ``` 最后,别忘了在AndroidManifest.xml中添加相应的权限声明,包括读写外部存储权限和使用相机的...

    Android客户端调用webService上传图片到服务器

    在Android客户端调用Web Service上传图片到服务器的过程中,主要涉及以下几个关键知识点: 1. **文件I/O操作**:客户端首先需要从SD卡或其他存储位置读取图片文件。这里使用`FileInputStream`读取图片文件,然后...

    Android实现图片左右滑动效果

    在Android开发中,实现图片左右滑动效果是常见的需求,比如在查看相册或轮播图时。这个功能可以通过多种方式实现,其中最常用的是使用ViewPager组件。ViewPager允许用户通过左右滑动手势在多个页面之间切换,非常...

    Android获取SD卡中选中图片的路径(URL)

    在Android开发中,获取SD卡上用户选择的图片路径是一个常见的需求,这通常涉及到与系统的媒体库交互,以便用户能够从相册中选取图片。以下将详细介绍如何实现这个功能。 首先,我们需要添加必要的权限到...

    Android 图片轮播(网络加载和本地图片)

    在Android应用开发中,图片轮播是一种常见的功能,用于展示一系列图片或广告,通常在网络加载和本地存储之间切换。这个开源项目"Android Image Slider"由daimajia提供,是GitHub上一个广受欢迎的解决方案,它修复了...

    Android背景图片模糊虚化Demo

    在Android开发中,背景图片模糊虚化是一种常见的视觉设计手法,可以提升应用界面的美观度和用户体验。"Android背景图片模糊虚化Demo"是针对这一功能的实例展示,旨在帮助开发者理解和实现类似效果。以下是对这个主题...

    Android 图片、视频播放器

    在Android平台上,开发一款能够处理图片浏览和视频播放的应用是一项常见的任务。本项目"Android 图片、视频播放器"提供了一套完整的源码,旨在帮助开发者实现这些功能,且具有良好的用户体验。源码中包含了丰富的...

Global site tag (gtag.js) - Google Analytics