ANDROID 裁剪View

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);
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 裁剪可以通过使用 `Bitmap.createBitmap()` 和 `Canvas.drawBitmap()` 方法来实现。 以下是一个简单的示例代码,该代码可以将一个位图文件裁剪成一个圆形,并显示在 ImageView 中: ```java Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_image); //获取位图文件 int width = bitmap.getWidth(); int height = bitmap.getHeight(); Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); //创建一个新的位图文件 Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, width, height); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawCircle(width / 2, height / 2, width / 2, paint); //绘制圆形 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); //将原始位图文件绘制到圆形中 ImageView imageView = findViewById(R.id.image_view); imageView.setImageBitmap(output); //将裁剪后的位图文件显示在 ImageView 中 ``` 在这个示例代码中,我们首先获取了原始的位图文件。然后,我们创建了一个新的位图文件,用于存储裁剪后的结果。接下来,我们使用 `Canvas` 对象在新位图文件上绘制一个圆形。然后,我们使用 `PorterDuffXfermode` 将原始位图文件绘制到圆形中。最后,我们将裁剪后的位图文件显示在 ImageView 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值