ANDROID 裁剪View

本文介绍了如何使用Android的View.setClipToOutline方法裁剪视图的外形为圆形或圆角矩形,并展示了如何针对不同Android版本进行适配。

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

Clipping Views(裁剪视图)

首先我们layout,设置两个正方形的TextView

<TextView  
        android:id="@+id/tv_1"  
        android:layout_width="100dp"  
        android:layout_height="100dp"  
        android:elevation="1dip"  
        android:layout_gravity="center"                
        />  
<TextView  
        android:id="@+id/tv_2"  
        android:layout_width="100dp"  
        android:layout_height="100dp"  
        android:elevation="1dip"  
        android:layout_gravity="center"               
        />  

然后我们将它们两分别裁剪成圆角正方形和圆形:

v1 = findViewById(R.id.tv_1);  
        v2 = findViewById(R.id.tv_2);  
        ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {  
            @Override  
            public void getOutline(View view, Outline outline) {  

                outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), 10);  
            }  
        };  
        ViewOutlineProvider viewOutlineProvider1 = new ViewOutlineProvider() {  
            @Override  
            public void getOutline(View view, Outline outline) {  

                outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), view.getHeight() / 2);  
            }  
        };  
        v1.setOutlineProvider(viewOutlineProvider);  
        v2.setOutlineProvider(viewOutlineProvider1);  

效果如下:
这里写图片描述




Clipping Views(裁剪视图)

可以使用View.setClipToOutline方法去剪切一个视图的outline区域。
只有rectangle,circle, 和round rectangle outlines支持裁剪(Outline.canClip方法用来判断是否可以裁剪)

floatingShape.setClipToOutline(true);  

下面请看一个使用裁剪的例子:

     int margin = Math.min(clippedView.getWidth(), clippedView.getHeight()) / 10;  
    Outline mClip = new Outline();  
    mClip.setRoundRect(margin, margin, clippedView.getWidth() - margin,  
            clippedView.getHeight() - margin, margin / 2);  
    /* Sets the Outline of the View. */  
    clippedView.setOutline(mClip);  
    /* Enables clipping on the View. */  
    clippedView.setClipToOutline(true);  

首先创建一个轮廓,给轮廓设置区域大小,添加轮廓到视图上,确认裁剪,效果图如下:

这里写图片描述

这里写图片描述


开源项目:AndroidSample:Topeka中的使用:

  @SuppressLint("NewApi")
  public void setAvatar(@DrawableRes int resId) {
    if (ApiLevelHelper.isAtLeast(Build.VERSION_CODES.LOLLIPOP)) { // 高于5.0版本
     //为了裁剪一个可绘制的视图形状,需要先设置一个outline然后调用View.setClipToOutline方法
      setClipToOutline(true);  

      setImageResource(resId);
    } else {
      setAvatarPreLollipop(resId); // 低于5.0版本
    }
  }

 // 低于5.0版本实现方法
 private void setAvatarPreLollipop(@DrawableRes int redId) {
    Drawable drawable = ResourcesCompat.getDrawable(getResources(), redId,
        getContext().getTheme());
    BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;

   RoundedBitmapDrawable roundedBitmapDrawable =  
       RoundedBitmapDrawableFactory.create(getResources(),bitmapDrawable.getBitmap());
    roundedBitmapDrawable.setCircular(true);
    setImageDrawable(roundedBitmapDrawable);
  }  

  .....

 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (ApiLevelHelper.isLowerThan(Build.VERSION_CODES.LOLLIPOP)) {
      return;
    }
    if (w > 0 && h > 0) {
      setOutlineProvider(new RoundOutlineProvider(Math.min(w, h))); //添加轮廓到视图上,确认裁剪
    }
  }

@TargetApi(Build.VERSION_CODES.LOLLIPOP) public class RoundOutlineProvider extends ViewOutlineProvider{

  private final int mSize;

  public RoundOutlineProvider(int size) {
    if (0 > size) {
      throw new IllegalArgumentException("size needs to be > 0. Actually was " + size);
    }
    mSize = size;
  }

  @Override public void getOutline(View view, Outline outline) {
    outline.setOval(0,0,mSize,mSize);
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值