美文网首页android基础Android开发经验谈Android技术知识
Android艺术开发探索学习之测量view的宽高以及动态设置V

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

作者: 103style | 来源:发表于2016-05-18 18:56 被阅读503次

    progress动态更新位置实战
    首先看看我们要实现的效果。

    效果就是这样 看起来这简单。 其实实现起来也很简单。
    之前做项目有碰到过这样的需求。
    首先获取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();
        }
    });
    
    1. 重写Activity或者View 的 onWindowFocusChanged这个方法。

    //方法3 onWindowFocusChanged(true) 表示view获得了焦点
    // 不过注意:onWindowFocusChanged 方法会在activity获得焦点和失去焦点的时候调用.

    @Override
    public 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("%"));
        }
    

    博客地址:http://blog.csdn.net/lxk_1993
    如果你喜欢我的博客,请关注我。
    欢迎留言拍砖。

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

    相关文章

      网友评论

      • Neulana:请问楼主用什么软件录的视频😋
        Neulana: @103style 感谢!
        103style:@加速度猫
        这是gif制作工具
        下载地址 http://download.csdn.net/download/lxk_1993/9518395
        或者 去 LICEcap 的官方网站下

      本文标题:Android艺术开发探索学习之测量view的宽高以及动态设置V

      本文链接:https://www.haomeiwen.com/subject/tvmwrttx.html