您的位置:首页 > 其它

纯原生打造GridView单行横向滑动(宽度自适应在父布局居中),手机屏幕px和dp的互换方法,附禁止滑动的自定义方法

2017-08-11 11:09 489 查看
布局文件:

HorizontalScrollView包裹LinearLayout(只能包裹这个),放入GridView,先实现横向滑动

<HorizontalScrollView
android:fillViewport="true"
android:layout_width="match_parent"
android:layout_height="85dp"
android:scrollbars="none"
android:layout_gravity="center_horizontal"
android:background="@android:color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<GridView
android:id="@+id/gv_tequan"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:cacheColorHint="#00000000"
android:scrollbars="none"
an
4000
droid:layout_gravity="center_horizontal"
android:listSelector="#00000000"></GridView>

</LinearLayout>
<!--@color/title_bg_color android:scrollbars="horizontal"-->
</HorizontalScrollView>


Java代码将GridView改成单行横向布局的工具类方法

只需要传入要改变的GridView对象和item的宽度即可实现

private void changeGridView(GridView mContentGv) {
LinearLayout.LayoutParams params=null;
int with=this.getWindowManager().getDefaultDisplay().getWidth();//获取手机屏幕宽度px
int withdip=DensityUtil.px2dip(this,with);//dip
int size = img_tequan.length;
// item宽度Gridview宽度在这里动态设置的

int shang=(int) withdip/80;
int itemWidth = DensityUtil.dip2px(this, 80);
int totalWidth=0;
if (shang>size){//item数量小于可以显示的最大容量
//            itemWidth =DensityUtil.px2dip(this, (int)withdip/(size));
//            totalWidth=DensityUtil.px2dip(this, itemWidth*size);
totalWidth= itemWidth*size;
mContentGv.setGravity(Gravity.CENTER_HORIZONTAL);
}else if(shang<=size) {
//            itemWidth=DensityUtil.px2dip(this, 85);
totalWidth=itemWidth*size+size;
}
// item之间的间隔
//        int itemPaddingH = DensityUtil.dip2px(this, 1);

// 计算GridView宽度 size * (itemWidth + itemPaddingH)
int gridviewWidth = totalWidth;

params = new LinearLayout.LayoutParams(
gridviewWidth, LinearLayout.LayoutParams.MATCH_PARENT);
mContentGv.setLayoutParams(params);
mContentGv.setColumnWidth(itemWidth);
//        mContentGv.setHorizontalSpacing(itemPaddingH);
mContentGv.setStretchMode(GridView.NO_STRETCH);
mContentGv.setNumColumns(size);
}


上文中的DensityUtil也是一个封装的方法,用来实现手机屏幕像素px和安卓开发的虚高和虚宽的相互转换,代码如下:

public class DensityUtil {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*
* @param context 上下文
* @param dpValue dp值
* @return px值
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

/**
*
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}


经过以上方法设置就可以实现GridView自适应宽度并且在父布局居中显示,

当item的总宽小于屏幕宽度时居中显示不滑动,

当item的总宽大于屏幕宽度时根据传入的item宽度计算总宽度,实现单行横向滑动

附:GridView禁止滑动的自定义方式:

GridView默认是竖直滑动,有时候只有一行也会滑动一点,为了显示效果简介需要禁止滑动,自定义GridView重写 dispatchTouchEvent方法,截取滑动事件:

public class MyGridView extends GridView {
public MyGridView(Context context) {
super(context);
}

public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_MOVE){
return true;//禁止Gridview进行滑动
}
return super.dispatchTouchEvent(ev);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐