Android艺术开发探索学习 之 测量view的宽高 以及 动态设置View的位置
来源:互联网 发布:yum pip 编辑:程序博客网 时间:2024/06/07 06:52
Android艺术开发探索学习 之 测量view的宽高 以及 动态设置View的位置
progress动态更新位置实战
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 onWindowFocusChanged(true) 表示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)
也可以点下下面的顶 (0.0)
2 0
- Android艺术开发探索学习 之 测量view的宽高 以及 动态设置View的位置
- Android艺术开发探索学习 之 测量view的宽高 以及 动态设置View的位置
- 艺术开发-View的测量
- Android开发艺术探索学习-View的基本知识
- Android开发艺术探索学习-View的滑动
- 《Android开发艺术探索》之View的事件体系和工作原理学习笔记
- 《Android开发艺术探索》之学习笔记(四)View的工作原理
- 《Android开发艺术探索》之学习笔记(三)View的基础知识
- android中view的宽高测量
- Android 测量View的宽高
- android测量View的宽高
- Android开发艺术探索(连载)之View 的事件体系(一)view的基本知识
- Android开发艺术探索(连载)之View的事件体系(二)View的滑动
- 测量View的宽高
- 【安卓开发艺术探索】第4章 View的测量、布局、绘制 笔记
- Android自定义View 之 View的测量
- View的滑动冲突解决-android开发艺术探索笔记
- 《Android开发艺术探索》读书笔记--part3 View的事件体系
- 常用正则表达式
- 笔记
- 魔改Cmake系列:编译caffe的时候找不到OpenCV
- Elasticsearch 之 不停服务重建索引
- BZOJ2836魔法树
- Android艺术开发探索学习 之 测量view的宽高 以及 动态设置View的位置
- hihocoder 1041 国庆出游 (DFS + bitset 好题)
- 深度学习实战——caffe windows 下训练自己的网络模型
- Android技术提高汇总(持续更新)
- compile fail log
- JAVA开发面试笔记(二)
- (8)七种排序算法的对比
- hibernate.cfg.xml配置文件
- OO程序设计原则