转载地址:http://blog.csdn.net/lxk_1993/article/details/50931607
Android艺术开发探索学习 之 测量view的宽高 以及 动态设置View的位置
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() {
-
- progesssValue.getViewTreeObserver().removeOnGlobalLayoutListener(this);
- int w = progesssValue.getMeasuredWidth();
- }
- });
3. 重写Activity或者View 的 onWindowFocusChanged这个方法。
-
-
- @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("%"));
- }
源码位置: