Material Design :ViewOutlineProvider

本文介绍如何使用ViewOutlineProvider裁剪Android中View的边界,包括圆形、矩形及带圆角的矩形裁剪方法,并提供了实现代码示例。

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

ViewOutlineProvider

google Android Sample:https://developer.android.google.cn/samples/ClippingBasic/index.html
Demo:https://git.oschina.net/Android5x/ClippingBasic01

简介

裁剪View的边界,注意使用ViewOutlineProvider,API>=21

效果图

这里写图片描述 这里写图片描述

步骤

通过点击Button,显示View原图和裁剪后的效果。

  • 继承类ViewOutlineProvider
  • 重写方法getOutline(...)
  • 设置OutlineProvider:view.setOutlineProvider(lineProvider)
  • 开始裁剪view.setClipToOutline(true);

类和方法

ClipOutLineProvider:裁剪View边界的类
setOutlineProvider(lineProvider):给View设置ClipOutLineProvider
tv.setClipToOutline(false):不裁剪边界
setRect(int left, int top, int right, int bottom):矩形
setRoundRect(int left, int top, int right, int bottom):有圆角的矩形
setOval (int left, int top, int right, int bottom):圆

注意:
setOval(...)裁剪后保留的是圆心区域,外部的裁掉
setRect(...)``setRoundRect(...),裁剪有2种效果
第一种:裁剪后保留的是左上角,第二种:裁剪后保留的是中心点。

outline.setRect(0,0,view.getWidth()/2,view.getHeight()/2);
outline.setRect(margin, margin, view.getWidth() - margin, view.getHeight() - margin);

这里写图片描述 这里写图片描述 这里写图片描述 这里写图片描述

主要代码

ClipOutLineProvider lineProvider = new ClipOutLineProvider();
tv.setOutlineProvider(lineProvider);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if(tv.getClipToOutline()){
            tv.setClipToOutline(false);
        }else{
            tv.setClipToOutline(true);
        }
    }
});
/**
 * minSdkVersion >= 21
 */
private class ClipOutLineProvider extends ViewOutlineProvider {
    @Override
    public void getOutline(View view, Outline outline) {
        int margin = 20;
        int radius = 50;
        outline.setRoundRect(margin, margin, view.getWidth() - margin, view.getHeight() - margin, radius);
    }
}

全部代码

public class MainActivity extends AppCompatActivity {

    private TextView tv;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        btn = (Button) findViewById(R.id.clip);


        ClipOutLineProvider lineProvider = new ClipOutLineProvider();
        tv.setOutlineProvider(lineProvider);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(tv.getClipToOutline()){
                    tv.setClipToOutline(false);
                }else{
                    tv.setClipToOutline(true);
                }
            }
        });
    }

    /**
     * minSdkVersion >= 21
     */
    private class ClipOutLineProvider extends ViewOutlineProvider {
        @Override
        public void getOutline(View view, Outline outline) {
            int margin = 80;
            int radius = 50;
//            outline.setRoundRect(0, 0, view.getWidth() - margin, view.getHeight() - margin, radius);
//            outline.setRoundRect(margin, margin, view.getWidth() - margin, view.getHeight() - margin, radius);

//            outline.setOval(0,0,view.getWidth(),view.getHeight());
//            outline.setOval(margin, margin, view.getWidth() - margin, view.getHeight() - margin);


            outline.setRect(0,0,view.getWidth() - margin, view.getHeight() - margin);
//            outline.setRect(margin, margin, view.getWidth() - margin, view.getHeight() - margin);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值