适配时,请注意单位:px、dpi

两个问题:

1、控制viewpager时候,若想在同一界面显示出来2-3个item该怎样(效果如图所示)




2、控制viewpager显示多个item时候,item的视图被挤压,该怎么办?

解答:

1、要想实现图中效果,发现只要控制viewpager中的两个参数:

android:clipToPadding="false"
android:paddingLeft="20dp"
android:paddingRight="20dp"
clipToPadding参数,网上是有讲解的;主要控制是paddingLeft和paddingRight,虽然为啥我也不太清楚;那么问题来了。。。padding的距离,该如何控制呢?
开始是想写死一个合适的,后来发现,手机宽高比不同,适配会有问题,过宽手机可能会导致两边的卡片露不出来,还算勉强可以;但是过窄的手机就不行了,会导致每个item被padding严重挤压,然后变形,甚至显示不全。解决道路只剩下用代码根据手机屏幕的宽高来适配了
2、适配思路:paddingLeft=0.5*(屏幕宽-图片宽)
最苦恼的莫过于代码中获取的长度,单位是啥?dp?px?还是啥?
最后根据网上查到的资料,做一下总结:
1)获取到本地图片尺寸(单位是px像素),从而得到图片比例:如图:536*798


BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.bg_quiz_card_front, opts);
opts.inSampleSize = 1;
opts.inJustDecodeBounds = false;
int width = opts.outWidth;
int height = opts.outHeight;
2)因为viewpager我们是固定了高度400dp,那么图片对应的imageview高度也会是400dp,那么对应的,我们根据根据图片的宽高比,就获得了图片在控件中的宽度
int picWidth = (int) ((double) 400 * (double) ((double) width / (double) height));
3)接着,我们想获取屏幕的dp,从而得到差值
WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int widthScreen = dm.widthPixels;// 屏幕宽度(像素)
int heightScreen = dm.heightPixels; // 屏幕高度(像素)
float density = dm.density;//屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = dm.densityDpi;//屏幕密度dpi(120 / 160 / 240)
//屏幕宽度算法:屏幕宽度(像素)/屏幕密度
int screenWidth = (int) (widthScreen / density);//屏幕宽度(dp)
int screenHeight = (int) (heightScreen / density);//屏幕高度(dp)
4)接着我们给viewpager赋值计算得后的padding距离
padding=(屏幕宽度-图片宽度)/2
这里需要注意:
viewPager.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
这个方法的参数都是px
我们需要把计算后的值换成px才行,
float subWidth = screenWidth - picWidth;
int paddingLeft = (int)(DimenUtils.dip2px(getActivity(), subWidth)*0.5);
int paddingRight = paddingLeft, paddingTop = 0, paddingBottom = 0;

public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f);}

dip2px方法如上
最后调用
viewPager.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
就完成适配啦





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值