Android GridView n行,自适应高度占满屏幕,不滚动

今天客户提出一个问题,要求我们首页的GrdiView,不要滚动,并且要根据不同的分辨率的手机和不同大小的手机,来自适应。高度占满屏幕。

于是我就开始了做屏幕的自适应。。首先,我根据张鸿洋大神的关于屏幕的自适应博客的http://blog.****.net/lmj623565791/article/details/45460089,生成了一系列尺寸文件Android GridView n行,自适应高度占满屏幕,不滚动
我是直接下载的jar,然后直接生成的,但是这个默认基准为400*320的,但是我们美工给的设计图的比例是646*375的(这是根据IOS来的)。
所以这个我不能用,,于是我就把GenerateValueFiles这个类copy了下来,然后修改了里面的参数
int baseW = 375;//设计图的宽
int baseH = 646;//设计图的高
Android GridView n行,自适应高度占满屏幕,不滚动
然后。根据客户的需要适配的尺寸。修改SUPPORT_DIMESION里面的内容。
Android GridView n行,自适应高度占满屏幕,不滚动

然后。大家就可以生成资源文件了。我用的是as。
在类上右击,然后选择,运行Run…Main即可。
Android GridView n行,自适应高度占满屏幕,不滚动

Android GridView n行,自适应高度占满屏幕,不滚动

然后,就可以在你的布局文件中,直接用了。例如设计图的toolbar的高度是44px,则你就可以直接写 android:layout_height=”@dimen/y44”,而不再需要担心我是否要转换下(Ps; @dimen/x44 代表宽度是44)

这样写以后。适配就好了很多。。
但是还有个问题就是相同尺寸的手机,手机的dpi不一样。。还是会造成前段的缩放不同,于是,就有了在同是720*1280的手机。一个dpi是240,一个dpi是320,就出现了,同样是两行,dpi为320的GridView,刚好充满屏幕,但是在240上,就出现,没有充满屏幕。
Android GridView n行,自适应高度占满屏幕,不滚动

Android GridView n行,自适应高度占满屏幕,不滚动

然后。。。就有了。计算屏幕剩下的高度然后/行数。来实现充满全屏。

Android GridView n行,自适应高度占满屏幕,不滚动

这里还有个知识点,就是获取控件的高度。
通过view.getHeight()获取控件的高度或者宽度是0,那是因为
熟悉view绘制流程的朋友应该一眼就看出来了。在onCreate中。我们的控件事实上还并没有画好,换句话说,等onCreate方法运行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0。
那么我们怎么得到控件的高度呢??
No1:
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
imageView.measure(w, h);
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();

这样的方法非常easy,就是我们自己来測量

No2:

ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
vto.removeOnPreDrawListener(this);
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();
return true;
}
});
这种方法。我们须要注冊一个ViewTreeObserver的监听回调,这个监听回调,就是专门监听画图的,既然是监听画图,那么我们自然能够获取測量值了,同一时候。我们在每次监听前remove前一次的监听。避免反复监听。

No3:

ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
imageView.getHeight();
imageView.getWidth();
}
});

这种方法于第2个方法基本同样,但他是全局的布局改变监听器,所以是最推荐使用的。
看过自定义带刷新和加载更多的ListView这个视屏的童鞋,应该见过方法3.。。视屏里,讲师用的就是这个,来获取刷新布局的高度的。。

至此。。完美解决了GridView,自适应高度,占满屏幕。
还要个禁止GridView的滑动,,
**gridView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
return true;
default:
break;
}
return false;
}
});**

OK。就这样。。感谢文章中用到的知识点的提供者。

然后献上一句我最近在一个人的朝圣中看到的话:
我们的选择不同又如何?反正我们殊途同归。。。