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

    xiaoxiao2021-12-14  18

    转载地址: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   progesssValue.post(new Runnable() {       @Override       public void run() {           int w = progesssValue.getMeasuredWidth();       }   });   2.ViewTreeObserver实现addOnGlobalLayoutListener接口(需要在API 16以上)。代码如下。 [java] view plain copy final ViewTreeObserver observer = progesssValue.getViewTreeObserver();  observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {      @TargetApi(Build.VERSION_CODES.JELLY_BEAN)      @Override      public void onGlobalLayout() {          //此处不能写 observer.removeOnGlobalLayoutListener(this); 否则会报错          progesssValue.getViewTreeObserver().removeOnGlobalLayoutListener(this);         int w = progesssValue.getMeasuredWidth();      }  });   3. 重写Activity或者View 的 onWindowFocusChanged这个方法。 [java] view plain copy //方法3 onWindowFocusChanged(true) 表示view获得了焦点  // 不过注意:onWindowFocusChanged 方法会在activity获得焦点和失去焦点的时候调用  @Override  public void onWindowFocusChanged(boolean hasFocus) {      super.onWindowFocusChanged(hasFocus);      if (hasFocus) {          int w = progesssValue.getMeasuredWidth();      }  }   然后就是动态改变View的位置,也比较简单。setOnTouchListener就好了。 [java] view plain copy full.setOnTouchListener(new View.OnTouchListener() {        @Override      public boolean onTouch(View v, MotionEvent event) {          switch (event.getAction()) {              case MotionEvent.ACTION_DOWN:                  x1 = (int) event.getRawX();                  break;              case MotionEvent.ACTION_MOVE:                  x2 = (int) event.getRawX();                  dx = x2 - x1;                  int w = getWindowManager().getDefaultDisplay().getWidth();                  if (Math.abs(dx) > w / 100) {                      x1 = x2; // 去掉已经用掉的距离, 去掉这句 运行看看会出现效果                      progesss.setProgress(progesss.getProgress() + dx * 100 / w);                      setPos();                  }                  break;              case MotionEvent.ACTION_UP:                  break;          }          return true;      }  });    /**  * 设置进度显示在对应的位置  */  public void setPos() {      int w = getWindowManager().getDefaultDisplay().getWidth();      Log.e("w=====""" + w);      ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) progesssValue.getLayoutParams();      int pro = progesss.getProgress();      int tW = progesssValue.getWidth();      if (w * pro / 100 < tW * 0.7) {          params.leftMargin = 0;      } else if (w * pro / 100 + tW * 0.3 > w) {          params.leftMargin = w - tW;      } else {          params.leftMargin = (int) (w * pro / 100 - tW * 0.7);      }      progesssValue.setLayoutParams(params);      progesssValue.setText(new StringBuffer().append(progesss.getProgress()).append("%"));  }   源码位置: 1.github:https://github.com/103style/ViewMeasure 有用的话帮忙star下   修改点击进度位置也可以调整进度 2.csdn资源下载:http://download.csdn.net/download/lxk_1993/9466638 也可以点下下面的顶  (0.0)

    转载请注明原文地址: https://ju.6miu.com/read-963672.html

    最新回复(0)