Android图片描边效果的实现

 更新时间:2023年12月12日 08:41:06   作者:时光少年  
这篇文章主要给大家介绍了Android图片描边效果的实现,在添加图片描边的时候我们用到的是图片蒙版技术,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下

前言

先看下我们阔爱滴海绵宝宝,其原图是一张PNG图片,我们给宝宝加上描边效果,今天我们使用的是图片蒙版技术。

说到蒙版可能很多人想起PS抠图软件,Android上也一样,同一个大树上可能会长出两种果实,但果实的根基是一样的。

什么是蒙版:所谓蒙版是只保留了alpha通道的一种二维正交投影,简单的说就是你躺在地上,太阳光直射下来,背后的那片就是你的蒙版。因此,它既不存在三维特征,也不存在色彩特征,只有alpha特征。那只有alpha通道的图片是什么颜色,这块没有具体了解过,但是理论上取决于默认填充色,在Android上最终是白色的,其他平台暂时还没了解。

提取蒙版

Android上提取蒙版比想象的容易,按照以往的思路,我们是要进行图片扫描这里,其实就是把所有颜色的red、green、blue都排除掉,只保留alpha,相当于缩小了通道数,排除采样和缩小图片,当然这个工作量是很大的,尤其是超高清图片。

Android 上提取蒙版,只需要把原图绘制到alpha通道的Bitmap上

bms = decodeBitmap(R.mipmap.mm_07);
bmm = Bitmap.createBitmap(bms.getWidth(), bms.getHeight(), Bitmap.Config.ALPHA_8);
Canvas canvas = new Canvas(bmm);
canvas.drawBitmap(bms, 0, 0, null);

蒙版绘制

蒙版绘制和其他Bitmap绘制是有差异的,ARGB_8888和RGB_565等色彩格式的图片,其本身是具备颜色的,但是蒙版图片不一样,他没有颜色,所以你绘制的时候,bitmap的颜色是你画笔Paint的填充色,突然想到可以做一个人体扫描的动画效果或者人体热力图。

canvas.drawBitmap(bmm, x, y, paint);

扩大蒙版(影子)

要让蒙版比比原图大,理论上是需要等比例放大蒙版在平移,还有一种方式是进行偏移绘制,我们这里使用偏移绘制。当然,这里取一定360,保证尽可能每个方向都有偏移,这是看到的外国人的算法。至于step>0 但是也要控制粒度,太小可能绘制次数太多,太大可能有些边缘做不到偏移。

for (int i = 0; i < 360; i += step) {
    float x = width * (float) Math.cos(Math.toRadians(i));
    float y = width * (float) Math.sin(Math.toRadians(i));
    canvas.drawBitmap(bmm, x, y, paint);
}

闪烁效果

我们价格颜色闪烁的效果,其实很简单,也不是本篇重要的部份,其实就是在色彩中间插入透明色,然后定时闪烁。

int index = -1;
int max = 15;
int[] colors = new int[max];
final int[] highlightColors = {0xfff00000,0,0xffff9922,0,0xff00ff00,0};

public void shake() {
    index = 0;
    for (int i = 0; i < max; i+=2) {
        colors[i] = highlightColors[i % highlightColors.length];
    }
    postInvalidate();
}

总结

本篇到这里就结束了,希望利用蒙版+偏移做出更多东西。

全部代码

public class ViewHighLight extends View {
    final Bitmap bms; //source 原图
    final Bitmap bmm; //mask 蒙版
    final Paint paint;
    final int width = 4;
    final int step = 15; // 1...45
    int index = -1;
    int max = 15;
    int[] colors = new int[max];
    final int[] highlightColors = {0xfff00000,0,0xffff9922,0,0xff00ff00,0};
    public ViewHighLight(Context context) {
        super(context);
        bms = decodeBitmap(R.mipmap.mm_07);
        bmm = Bitmap.createBitmap(bms.getWidth(), bms.getHeight(), Bitmap.Config.ALPHA_8);
        Canvas canvas = new Canvas(bmm);
        canvas.drawBitmap(bms, 0, 0, null);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }

    private Bitmap decodeBitmap(int resId) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inMutable = true;
        return BitmapFactory.decodeResource(getResources(), resId, options);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // draw blur shadow

        for (int i = 0; i < 360; i += step) {
            float x = width * (float) Math.cos(Math.toRadians(i));
            float y = width * (float) Math.sin(Math.toRadians(i));
            canvas.drawBitmap(bmm, x, y, paint);
        }
        canvas.drawBitmap(bms, 0, 0, null);

        if(index == -1){
            return;
        }
        index++;
        if(index > max +1){
            return;
        }
        if(index >= max){
            paint.setColor(Color.TRANSPARENT);
        }else{
            paint.setColor(colors[index]);
        }
        postInvalidateDelayed(200);
    }


    public void shake() {
        index = 0;
        for (int i = 0; i < max; i+=2) {
            colors[i] = highlightColors[i % highlightColors.length];
        }
        postInvalidate();
    }
}

以上就是Android;图片描边效果实现的详细内容,更多关于Android 图片描边的资料请关注脚本之家其它相关文章!

相关文章

  • Android Viewpager实现轮播广告图

    Android Viewpager实现轮播广告图

    这篇文章主要为大家详细介绍了Android Viewpager实现轮播广告图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android学习笔记之ListView复用机制详解

    Android学习笔记之ListView复用机制详解

    本篇文章主要介绍了Android学习笔记之ListView复用机制详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Android实现自定义带文字和图片Button的方法

    Android实现自定义带文字和图片Button的方法

    这篇文章主要介绍了Android实现自定义带文字和图片Button的方法,涉及Android针对Button按钮的布局与设计技巧,需要的朋友可以参考下
    2015-05-05
  • Android开发中如何去掉app标题栏的实现

    Android开发中如何去掉app标题栏的实现

    这篇文章主要介绍了Android开发中如何去掉app标题栏的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 浅谈Android IPC机制之Binder的工作机制

    浅谈Android IPC机制之Binder的工作机制

    IPC机制即为跨进程通信,是inter-Process Communication的缩写。是指两个进程之间进行通信。在说进程通信之前,我们的弄明白什么是线程,什么是进程。进程和线程是两个截然不同的概念。本文将介绍Android IPC机制之Binder的工作机制。
    2021-06-06
  • 使用DrawerLayout组件实现侧滑抽屉的功能

    使用DrawerLayout组件实现侧滑抽屉的功能

    DrawerLayout组件同样是V4包中的组件,也是直接继承于ViewGroup类,所以说是一个容器类,下面通过本文给大家介绍使用DrawerLayout组件实现侧滑抽屉的功能,感兴趣的朋友一起看下吧
    2016-08-08
  • Android Service开发应用实例

    Android Service开发应用实例

    Android的服务是开发Android应用程序的重要组成部分。不同于活动Activity,服务是在后台运行,服务没有接口,生命周期也与活动Activity非常不同。通过使用服务我们可以实现一些后台操作,比如想从远程服务器加载一个网页等,下面来看看详细内容,需要的朋友可以参考下
    2022-12-12
  • Android自定义圆形进度条

    Android自定义圆形进度条

    这篇文章主要为大家详细介绍了Android自定义圆形进度条的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Android UI设计与开发之仿人人网V5.9.2最新版引导界面

    Android UI设计与开发之仿人人网V5.9.2最新版引导界面

    这篇文章主要为大家详细介绍了Android UI设计与开发之仿人人网V5.9.2最新版引导界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android Mms之:深入理解对话列表管理

    Android Mms之:深入理解对话列表管理

    本篇文章是对Android中的对话列表管理进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论