在android中有时候要求只显示view的部分区域,这个时候就需要对当前的view进行剪裁的操作。在android中剪裁当前的view的有两种方法:一种是直接截取view,第二种是通过Outline设置。涉及到的类方法如下:

  1. View.getGlobalVisibleRect(Rect rect)
  2. View.setClipBounds(Rect rect)
  3. View.setOutlineProvider()
  4. View.setClipToOutline(boolean clipToOutline)

  getGlobalVisibleRect(Rect rect):获取当前view的可视区域,坐标系使用的Root View的也就是DecorView的坐标系,这点需要注意,不是View自身的坐标系

  setClipBounds(Rect rect),直接指定当前view的可视区域,当前的Rect使用的view的自身的坐标系。

  setOutlineProvider(),设置当前View的Outline。

  setClipToOutlines(),截取当前的可视区域到Outline,如果设置setClipBounds()方法,这个方法就失效了。

 

下面通过一个简单的例子来说明一下这几个方法的使用:

MainActivity.java

 1 package com.app.motiongear.clipboundsmotion; 2  3 import android.graphics.Rect; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.ImageView;10 11 public class MainActivity extends AppCompatActivity implements View.OnClickListener {12 13     Button mRectBtn, mBoundBtn;14     ImageView mImageView;15     Rect originRect = new Rect();16 17     @Override18     protected void onCreate(Bundle savedInstanceState) {19         super.onCreate(savedInstanceState);20         setContentView(R.layout.activity_main);21 22         mRectBtn = (Button) this.findViewById(R.id.btn1);23         mBoundBtn = (Button) this.findViewById(R.id.btn2);24         mImageView = (ImageView) this.findViewById(R.id.imageview);25         mRectBtn.setOnClickListener(this);26         mBoundBtn.setOnClickListener(this);27         mImageView.setOutlineProvider(new CustomOutlineProvider());28     }29 30 31     @Override32     public void onClick(View v) {33         if (v == mRectBtn) {34             //getGlobalVisibleRect()相对与父布局的rect35             mImageView.getGlobalVisibleRect(originRect);36             int centerX = (originRect.right - originRect.left) / 2;37             int centerY = (originRect.bottom - originRect.top) / 2;38             //设置View的显示区域,坐标是自身39             Rect tmp = new Rect(centerX - 150, centerY - 150, centerX + 150, centerY + 150);40             mImageView.setClipBounds(tmp);41         }42         if (v == mBoundBtn) {43             //通过Outline设置44             if(!mImageView.getClipToOutline()){45                 mImageView.setClipToOutline(true);46             }else{47                 mImageView.setClipToOutline(false);48             }49 50         }51     }52 }

 

CustomOutlineProvider.java

 1 package com.app.motiongear.clipboundsmotion; 2  3 import android.graphics.Outline; 4 import android.graphics.Rect; 5 import android.view.View; 6 import android.view.ViewOutlineProvider; 7  8 /** 9  * Created by ubuntu on 15-11-13.10  */11 public class CustomOutlineProvider extends ViewOutlineProvider {12 13     @Override14     public void getOutline(View view, Outline outline) {15         Rect rect = new Rect();16         view.getGlobalVisibleRect(rect);17         int leftMargin =100;18         int topMargin = 100;19         Rect selfRect = new Rect(leftMargin, topMargin,20                 rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin);21         outline.setRoundRect(selfRect, 30);22     }23 }

 

调用clipToBounds()方法:

 

调用clipToOutline()方法:

转载于:https://www.cnblogs.com/summerpxy/p/4962761.html

更多相关文章

  1. Android中service的使用
  2. adb 5037 端口占用解决
  3. Android(安卓)2.3 CTS测试修改测试结果和调试方法
  4. android 唯一识别码笔记
  5. Activity和Fragment之间的数据通信
  6. Android中两种设置全屏或者无标题的方法
  7. *.android.com上不去的解决方法
  8. Android中Intent传递Java对象的方法
  9. Android(安卓)Tabhost使用方法详解

随机推荐

  1. android的Menu使用
  2. Android NDK r8 windows环境搭建
  3. 从J2EE转向Android的第八天-----Toast
  4. Android视频播放器源码
  5. Android高手进阶教程(三)之----Android(
  6. Android四大组件之~~ContentProvider
  7. android 设置progressbar的背景颜色
  8. 两种button点击后改变颜色的方法selectot
  9. Android中使EditText失去焦点禁止弹出键
  10. [置顶] android 抽屉效果,内容GridView来