Android艺术开发探索学习 之 测量view的宽高 以及 动态设置View的位置

来源:互联网 发布:淘宝运营培训班视频 编辑:程序博客网 时间:2024/05/24 00:50

转载地址:http://blog.csdn.net/lxk_1993/article/details/50931607


Android艺术开发探索学习 之  测量view的宽高 以及 动态设置View的位置
progress动态更新位置实战

转载请标明出处: 

http://blog.csdn.NET/lxk_1993/article/details/50931607

本文出自:【lxk_1993的博客】;   


首先看看我们要实现的效果。




效果就是这样 看起来这简单。 其实实现起来也很简单。

之前做项目有碰到过这样的需求。
首先获取View的宽度和高度。刚开始我以为很简单,直接在onCreate()方法下直接获取view的宽度,
但是我发现 w 一直为0. 
然后又想到,在onResume的时候视图已经出来在我们视野了,在这里获取应该可以了吧。
然后结果让我大失所望。
后面百度找解决方法,用ViewTreeObserver实现了。

然后最近看android艺术开发探索的时候又看到了这个问题的解决方法。遂记录下来。
获取View的宽高的方法有很多,这里给出三种解决方法。

1.通过post将一个runnable投递要消息队列的尾部,然后等待looper调用此方法的时候,视图也已经初始化好了。
用法如下:progressValue为你要测量的view
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. progesssValue.post(new Runnable() {  
  2.     @Override  
  3.     public void run() {  
  4.         int w = progesssValue.getMeasuredWidth();  
  5.     }  
  6. });  



2.ViewTreeObserver实现addOnGlobalLayoutListener接口(需要在API 16以上)。代码如下。
[java] view plain copy
在CODE上查看代码片派生到我的代码片
  1. final ViewTreeObserver observer = progesssValue.getViewTreeObserver();  
  2. observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
  3.     @TargetApi(Build.VERSION_CODES.JELLY_BEAN)  
  4.     @Override  
  5.     public void onGlobalLayout() {  
  6.         //此处不能写 observer.removeOnGlobalLayoutListener(this); 否则会报错  
  7.         progesssValue.getViewTreeObserver().removeOnGlobalLayoutListener(this);  
  8.        int w = progesssValue.getMeasuredWidth();  
  9.     }  
  10. });  
3. 重写Activity或者View 的 onWindowFocusChanged这个方法。
[java] view plain copy
在CODE上查看代码片派生到我的代码片
  1. //方法3 onWindowFocusChanged(true) 表示view获得了焦点  
  2. // 不过注意:onWindowFocusChanged 方法会在activity获得焦点和失去焦点的时候调用  
  3. @Override  
  4. public void onWindowFocusChanged(boolean hasFocus) {  
  5.     super.onWindowFocusChanged(hasFocus);  
  6.     if (hasFocus) {  
  7.         int w = progesssValue.getMeasuredWidth();  
  8.     }  
  9. }  
然后就是动态改变View的位置,也比较简单。setOnTouchListener就好了。
[java] view plain copy
在CODE上查看代码片派生到我的代码片
  1. full.setOnTouchListener(new View.OnTouchListener() {  
  2.   
  3.     @Override  
  4.     public boolean onTouch(View v, MotionEvent event) {  
  5.         switch (event.getAction()) {  
  6.             case MotionEvent.ACTION_DOWN:  
  7.                 x1 = (int) event.getRawX();  
  8.                 break;  
  9.             case MotionEvent.ACTION_MOVE:  
  10.                 x2 = (int) event.getRawX();  
  11.                 dx = x2 - x1;  
  12.                 int w = getWindowManager().getDefaultDisplay().getWidth();  
  13.                 if (Math.abs(dx) > w / 100) {  
  14.                     x1 = x2; // 去掉已经用掉的距离, 去掉这句 运行看看会出现效果  
  15.                     progesss.setProgress(progesss.getProgress() + dx * 100 / w);  
  16.                     setPos();  
  17.                 }  
  18.                 break;  
  19.             case MotionEvent.ACTION_UP:  
  20.                 break;  
  21.         }  
  22.         return true;  
  23.     }  
  24. });  
  25.   
  26. /** 
  27.  * 设置进度显示在对应的位置 
  28.  */  
  29. public void setPos() {  
  30.     int w = getWindowManager().getDefaultDisplay().getWidth();  
  31.     Log.e("w=====""" + w);  
  32.     ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) progesssValue.getLayoutParams();  
  33.     int pro = progesss.getProgress();  
  34.     int tW = progesssValue.getWidth();  
  35.     if (w * pro / 100 < tW * 0.7) {  
  36.         params.leftMargin = 0;  
  37.     } else if (w * pro / 100 + tW * 0.3 > w) {  
  38.         params.leftMargin = w - tW;  
  39.     } else {  
  40.         params.leftMargin = (int) (w * pro / 100 - tW * 0.7);  
  41.     }  
  42.     progesssValue.setLayoutParams(params);  
  43.     progesssValue.setText(new StringBuffer().append(progesss.getProgress()).append("%"));  
  44. }  

源码位置:
1.github:https://github.com/103style/ViewMeasure 有用的话帮忙star下   修改点击进度位置也可以调整进度
2.csdn资源下载:http://download.csdn.net/download/lxk_1993/9466638
也可以点下下面的顶  (0.0)

0 0
原创粉丝点击