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);
}
}
}