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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM