view中显示部分区域

在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()方法:

时间: 2024-11-06 06:54:15

view中显示部分区域的相关文章

(转载)数据库存取图片并在MVC3中显示在View中

简介:在有些情况下需要将图片转换为二进制流存放在数据库中,当显示时再从数据库中读出来显示在界面上. 本文简单介绍数据库中图片的存取方法,并在MVC3中显示在Razor视图中.仅供初学者参考学习. 1. 将图片转换为二进制流 /// <summary> /// convert a picture file to byte array /// </summary> public byte[] GetBytesFromImage(string filename) { FileStream

得到ImageView中drawable显示的区域的计算方法

我们都知道Imageview中有不同的拉伸比率,比如fitStart,centCrop这样的,所以imageview中的drawable不一定和imageview占有相同的位置和大小,那么怎么计算呢? 思路: 1.得到imageview现在的宽高 2.得到imageview现在显示的区域(Rect) 3.得到drawable本身图片的宽高 4.得到drawable显示时的缩放比例 5.计算得到drawable现在显示的宽高 6.通过drawable显示的宽高和imageview显示的宽高来计算出

在Android 窗口小组件(Widget)中显示(StackView,ListView,GridView)集合View

在Android 3.0 中引入了 Collection View Widget.用于在窗口小组件中添加了对集合View 的支持. 如下: (1)StackView 一个卡片View,以层叠的方式显示其子View. (2)ListView 和传统的ListView一样 (3)GridView 网格列表.具体用法和传统的一样. 第一步:创建Widget布局文件    (1)Wdiget的布局文件 路径:res/layout/my_widget_layout.xml <?xml version=&quo

使用canvas与Paint在View中居中绘制文字

本博客只要没有注明"转",那么均为原创,转贴请注明本博客链接链接 我们在自定义View中有的时候会想自己绘制文字,自己绘制文字的时候,我们通常希望把文字精确定位,文字居中(水平.垂直)是普遍的需求,所以这里就以文字居中为例,看一下android中的文字应该如何绘制,它与Java又有什么区别. 先来看看我们的目标,见下图 上图是我打开了"显示布局边界"后截的图,所有会有好多框框. 仔细观察上图文字区域,我们会发现文字区域中有5条颜色不同的线.按着从上到下的顺序,他们的

使用swift在sprite中显示圆角UIButton按钮

我对objective-C不是很熟,UIKit以前没有用过,SpriteKit也只看了遍教程,然后看了一遍swift语言教程,此时开始编写这个程序,所以遇到的问题比较小儿科,解决方法也是曲线救国,希望有高人指点解决这些问题的简单方法,有好的解决方法后,我会随时进行本日志的修改,以免误导他人. 程序界面很是简单 然后点击中间的游戏区域,会roll色子,随机产生1~6的数字,飞机前进若干步,遇到梯子向前跳若干步,而遇到蛇则后退若干步,指导抵达25格,游戏结束. 上面有一个标签,显示游戏状态和Roll

使用OpenCV查找二值图中最大连通区域

http://blog.csdn.net/shaoxiaohu1/article/details/40272875 使用OpenCV查找二值图中最大连通区域 标签: OpenCVfindCoutours 2014-10-19 22:31 2802人阅读 评论(0) 收藏 举报  分类: 图像与OpenCV(15)  版权声明:本文为shaoxiaohu原创文章,欢迎转载,请注明出处,谢谢. 上一篇博文中介绍了matlab查找最大连通区域的方法,OpenCV函数中也有类似的函数与之对应,findC

C#在listview控件中显示数据库数据

一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 设置一列的Text属性,这就是列名 添加三列 3.编辑items属性,添加一行数据 编辑Text属性,添加一行的第一个数据 编辑subitems属性,添加一行中的其他数据 添加两个数据 填写结果 二.在listview中显示数据库数据 //在listview中显示数据库数据 private voi

097在进度条中显示进度百分比

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 #import "KMProgressViewWithLabel.h" 3 4 @interface ViewController : UIViewController 5 @property (strong, nonatomic) KMProgressViewWithLabel *progressViewCustom; 6 7 @end ViewController.m

Qt中显示复杂列表

提要 最近想要完成的一个项目需要显示一个列表,可以动态增减,可编辑,有checkbox.类似于这样 或者这样 但网上的例子都是这样 和这样 ... 最后实现的效果: QListWidget解决方案 在Android实现这样的列表是非常简单的,首先定义布局XML,然后再定义一个Adapter就可以了. Qt中类似的解决方案就是QListWidget. 自定义一个Widget类作为Item,比如 class UsersListItem : public QWidget { Q_OBJECT publ