开启生长之旅!这是我参与「日新计划 2 月更文挑战」的第 10 天,点击查看活动详情

前言

今日写什么呢,没有太好的思路,就随意写一些细节的点吧。
平时咱们都会接触到的一个东西便是设置view的边际为圆角,因为默认的直角比较难看,这个是触及比较多的场景,其它当然也有一些场景需用到非正常边框的情况,也需求裁切。

1. 设置圆角边框

一般咱们怎样设置圆角边框的

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff" />
    <stroke
        android:width="0.8dp"
        android:color="#ffffff" />
    <corners android:radius="10dp" />
</shape>

这是咱们比较常做的设置边框圆角的操作,有没有过这样去设置会不会出问题?其实这样的操作只不过是改动背景罢了,它可能会呈现内部内容穿透的作用。

2. 运用ClipToOutline进行裁切

这个是android 5.0之后提出的办法,详细的操作是这样

public static void setRoundRect(View view) {
    try {
        view.setOutlineProvider(new ViewOutlineProvider() {
            @Override
            public void getOutline(View view, Outline outline) {
                outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), 10);
            }
        });
        view.setClipToOutline(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

能够看出便是调用了view的setOutlineProvider办法和setClipToOutline办法。看这个ViewOutlineProvider,它的注释是
Interface by which a View builds its Outline, used for shadow casting and clipping.

能显着看出它便是为了处理阴影和裁切的。其间咱们要设置的话,主要是设置Outline outline这个目标,咱们能够看看它所提供的办法

setRect

先随意拿一张图片表示本来的显现作用来做对比

Android边框裁切的正确姿势

调用setRect给原图进行边际裁切

outline.setRect(view.getWidth()/4, view.getWidth()/4, view.getWidth()/4 *3, view.getHeight()/4 * 3);

得到这样的作用,留意,我的原作用是贴边的,这些裁切之后发现是不贴边的

Android边框裁切的正确姿势

setRoundRect的作用和setRect相同,便是多了一个参数用来设置圆角。这儿就不演示了

setOval 调用setOval,它的传参和setRect相同

outline.setOval(view.getWidth()/4, view.getWidth()/4, view.getWidth()/4 *3, view.getHeight()/4 * 3);

能够看到作用

Android边框裁切的正确姿势

发现再裁切尺寸的一起而且把图片切成圆形,我记得很早之前,还没毕业时做圆形头像的时分还需求引用别人的第三方,现在5.0之后直接调这个就行,多方便。当然现在头像都是用Glide来做。

setAlpha和setConvexPath也相同,etAlpha是设置透明度,setConvexPath是设置路径,路径和自定义view相同用Path,我这边就不演示了

3.总结

Outline相对于shape来说,是真正的实现边际裁切的,shape其实仅仅设置背景罢了,它的view的范围仍是那个正方形的范围。最显着的表现于,shape假如内容填满布局,会看到内容超出圆角,而Outline不会。当然假如你shape配合padding的话必定也不会呈现这种情况。

运用Outline也需求留意,一般的机子会在当范围超过圆之后,会一直显现圆。比如你设置radius为50是圆角的作用,但是乃至成100已经是整个边是半圆,这时你设200会发现仍是半圆,但是在某些机子上200会变成圆锥,所以假如要做半圆的作用也需求去计算好radius