在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     @Override
18     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     @Override
32     public void onClick(View v) {
33         if (v == mRectBtn) {
34             //getGlobalVisibleRect()相对与父布局的rect
35             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     @Override
14     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

view中显示部分区域相关推荐

  1. 移动场景在其缩略图中显示场景中所显示的区域

    需求描述 在场景中实现拖动,缩放,并在场景的缩略图中显示其对应在视口中显示的矩形区域. 程序效果图如下: 开发环境:Qt 5.13.1 编译环境:MinGW64 项目结构: 直接上程序: main.c ...

  2. Android 曝光采集,商品view曝光量的统计,判断RecyclerView中某子view是否可见 view是否显示在屏幕中 view展示次数统计...

    近期pm提出需要统计首页商品的曝光亮,由于我们的首页是用的recylerview实现的,这里就来讲下如何使用监听recylerview的滚动事件来实现子view的曝光量统计,我们这里说的view都是列 ...

  3. 区域显示触发_Unity3D 在Hierarchy窗口中显示物体所属Layer

    我们想要查看场景中物体的Layer时,需要在Hierarchy窗口中点击GameObject,然后才能在Inspector中显示Layer等相关属性, 当场景物体多的时候,这个操作还是比较麻烦的.那么 ...

  4. 在html中加入滚动条,html在div中显示滚动条

    基本思路:滚动条要添加到内容部分的父标签上(div),内容部分不设置大小,父标签要明确设置大小,并且父标签要添加overflow样式,并设置成auto. 打开的效果如下: 这时可能有人会问,父div的 ...

  5. android listview headerview 分割线,【我的Android进阶之旅】如何去除ListView中Header View、Footer View中的分割线...

    最近的项目中给ListView 加入了一个Header View之后,发现Header View的下方也有了分割线,很难看,UI要求将Header View的分割器去掉,好吧.现在就来说一说如何如何去 ...

  6. ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用

    ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用 原文:ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用 文章来源: Slark.N ...

  7. android 部分区域点击,Android编程实现ListView中item部分区域添加点击事件功能

    本文实例讲述了Android编程实现ListView中item部分区域添加点击事件功能.分享给大家供大家参考,具体如下: 需求如题目:Android listview中item部分区域添加点击事件,在 ...

  8. android 在指定位置添加布局,Android 如何动态添加 View 并显示在指定位置。

    引子 最近,在做产品的需求的时候,遇到 PM 要求在某个按钮上添加一个新手引导动画,引导用户去点击.作为 RD,我哗啦啦的就写好相关逻辑了.自测完成后,提测,PM Review 效果. 看完后,PM ...

  9. android动态添加控件在指定位置,Android 如何动态添加 View 并显示在指定位置。

    引子 最近,在做产品的需求的时候,遇到 PM 要求在某个按钮上添加一个新手引导动画,引导用户去点击.作为 RD,我哗啦啦的就写好相关逻辑了.自测完成后,提测,PM Review 效果. 看完后,PM ...

最新文章

  1. 有关定时任务的表达式--cron 详细解
  2. 干货!高容错微服务架构设计思路
  3. 【Android 应用开发】Android 图表绘制 achartengine 示例解析
  4. 图解Dev C++ 创建Win32 项目模板
  5. HTML5常用标签及特殊字符表
  6. select * from ( union ) ')' 附近有语法错误。
  7. xxljob 配置具体定时任务_分布式任务调度: XXL-Job
  8. (2)vue.js介绍
  9. 测测自己最像哪幅名画?谷歌博物馆App新推自拍功能
  10. [javaSE] 集合工具类(Collections-sort)
  11. Java使用BufferedImage修改图片内容
  12. go编程语言为什么这么流行?
  13. 海康威视多摄像头视频实时采集——OpenCV显示
  14. 计算机保护插件无法安装,电脑无法安装ActiveX控件怎么办
  15. 服务器系统能装cad吗,服务器主机用CAD画图吗
  16. c语言 获取中文首字母,C语言获取汉字拼音首字母
  17. vue实现马赛克功能
  18. 最简示例 简介洗牌函数 之 __shfl_sync() cuda 之 shuffle
  19. vue如何跳转支付宝付款页面
  20. 《MySQL DBA修炼之道》——1.3 查询执行过程概述

热门文章

  1. 实践2.2 内核模块编译
  2. 边工作边刷题:70天一遍leetcode: day 11-1
  3. [Windows Server 2012] 安装IIS8.5及FTP
  4. cocos2d-x 3.X (二)创建动起来的精灵
  5. 从数据仓库系统对比看Hive发展前景
  6. ASP基础教程之ASP AdRotator 组件的使用
  7. Add-in and Automation Development In VB.NET 2003 (8)
  8. 安卓安装包不能覆盖原安装包_LOL手游全网最简单注册,安装教程,安卓 IOS皆可登录!攻略群有游戏安装包!...
  9. (80)ADC采集方法(基于LVDS采集方法)
  10. vue 复制 长按_Vue