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
progesssValue.post(new Runnable() {    @Override    public void run() {        int w = progesssValue.getMeasuredWidth();    }});

2.ViewTreeObserver实现addOnGlobalLayoutListener接口(需要在API 16以上)。代码如下。
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这个方法。
//方法3 onWindowFocusChangedtrue) 表示view获得了焦点 // 不过注意:onWindowFocusChanged 方法会在activity获得焦点和失去焦点的时候调用 @Overridepublic void onWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    if (hasFocus) {        int w = progesssValue.getMeasuredWidth();    }}


然后就是动态改变View的位置,也比较简单。setOnTouchListener就好了。
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)

更多相关文章

  1. Android小知识-自定义View相关知识(1)
  2. 关于Android(安卓)SDK包里没有/docs文件夹帮助文档的处理方法
  3. android 显示消息框的方法
  4. android中对apk文件反编译的方法(详细)
  5. Android(安卓)Studio导入jar后无法识别、但项目能正常运行的问题
  6. Java、Android的异常处理原理&Android(安卓)Crash捕获、分发及处
  7. 百度 腾讯 阿里UC 迅雷 部分Android笔试 面试题
  8. Android辅助功能
  9. Android(安卓)源码分析之旅3.4--onConfigurationChanged

随机推荐

  1. 为 Android 添加 Java 层服务
  2. 两张图让你完全了解IDEA和Android Studio
  3. SDL2库(4)-Android(安卓)端源码简要分析(A
  4. Android(安卓)studio 软件安装过程中遇到
  5. Android中Handler的作用
  6. android7.1 外置SD卡三方应用没有读写权
  7. android 卡通片资源Tween动画
  8. Android系统概述
  9. Android(安卓)之 WallpaperManager用法
  10. android textview改变部分文字的颜色和st