Android屏幕适配功能源码

来源:互联网 发布:淘宝全球购 买手直播 编辑:程序博客网 时间:2024/05/16 08:00

屏幕适配这个东西

当时做的时候挺纠结  

小手机,大pad上面显示不一致

所以屏幕适配还是很需要的 

Android自适应有时候解决不了我们的需求 

其实原理很简单,通过得到手机屏幕的像素和图片资源小大相除得到一个倍率,然后把项目中图片的资源和布局的位置都乘以这个倍率

当时项目只用了一套资源,就是800*480界面大小的资源文件,所以就可以用这样的代码得到倍率

float scaleX = screenWidth/800.0f;float scaleY = screenHeight/480.0f;

但是一般项目用到的图片资源大小各不相同,屏幕的大小也各不相同,所以得出的倍率应该是动态的,如以下代码:

float scaleX = screenWidth/resourcesWidth;float scaleY = screenHeight/resourcesHeight;

这样子乘以这个得出的倍率之后,适配屏幕的工作就适配好了,大小屏幕,分辨率就都能适应好了。

这个代码都是现成的可以拿来用

已经把方法名接口留出来了

贴出这个源码也希望各位看官指教  

然后给出一些可以优化的内容 


import android.app.Activity;import android.util.DisplayMetrics;import android.view.View;import android.view.ViewGroup;import android.view.ViewGroup.MarginLayoutParams;import android.widget.AbsoluteLayout;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;/** * 屏幕适配器,各种分辨率下对显示界面进行适配。 *  * @author dinghq.alex@gmail.com * @since 2014.1.15 * */public class ScreenAdapter {private Activity activity = null;private float debugScreenW = 800.0f;private float debugScreenH = 480.0f;private float debugDensityDpi = 240.0f;private float scaleDpi = 1.0f;private float scalePxX = 1.0f;private float scalePxY = 1.0f;private float scaleDensity = 1.0f;private static ScreenAdapter instance = null;public static ScreenAdapter create(Activity screen) {if (instance == null) {instance = new ScreenAdapter(screen);}return instance;}public static ScreenAdapter get() {if (instance == null) {instance = new ScreenAdapter(null);}return instance;}public ScreenAdapter(Activity screen) {this.activity = screen;initDebug();getDensityDpi();}private void initDebug() {if (activity == null) {return;}DisplayMetrics display = activity.getResources().getDisplayMetrics();if (display == null) {display = new DisplayMetrics();}activity.getWindowManager().getDefaultDisplay().getMetrics(display);scaleDensity = display.scaledDensity;int densityDpi = display.densityDpi;int screenW = display.widthPixels;int screenH = display.heightPixels;scalePxX = (screenW / debugScreenW) / (densityDpi / debugDensityDpi);scalePxY = (screenH / debugScreenH) / (densityDpi / debugDensityDpi);}private void getDensityDpi() {DisplayMetrics display = activity.getResources().getDisplayMetrics();if (display == null) {display = new DisplayMetrics();}activity.getWindowManager().getDefaultDisplay().getMetrics(display);int densityDpi = display.densityDpi;scaleDpi = densityDpi / debugDensityDpi;}private int px2sp(float px) {final float fontScale = scaleDensity;return ((int) (px / fontScale + 0.5f));}public void sizeAdapted(View dst) {if (activity == null || dst == null) {return;}int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);dst.measure(w, h);float width = dst.getMeasuredWidth();float height = dst.getMeasuredHeight();ViewGroup.LayoutParams params = dst.getLayoutParams();if (!(dst instanceof TextView && !(dst instanceof Button)&& !(dst instanceof ImageView) && (params.width == ViewGroup.LayoutParams.FILL_PARENT|| params.width == ViewGroup.LayoutParams.MATCH_PARENT || params.width == ViewGroup.LayoutParams.WRAP_CONTENT))) {if (params.width == ViewGroup.LayoutParams.FILL_PARENT|| params.width == ViewGroup.LayoutParams.MATCH_PARENT|| params.width == ViewGroup.LayoutParams.WRAP_CONTENT) {params.width = (int) (width * scalePxX);params.height = (int) (height * scalePxY);} else {params.width = (int) (params.width * scalePxX);params.height = (int) (params.height * scalePxY);}}if (dst instanceof TextView) {TextView tv = (TextView) dst;float tsizePx = tv.getTextSize();float tsizeSp = px2sp(tsizePx);tsizeSp *= scalePxY;tv.setTextSize(tsizeSp);}dst.setLayoutParams(params);dst.postInvalidate();}public void positionAdapted(View dst) {if (activity == null || dst == null) {return;}ViewGroup.LayoutParams params = dst.getLayoutParams();if (params instanceof MarginLayoutParams) {MarginLayoutParams rparams = (MarginLayoutParams) params;rparams.leftMargin *= scalePxX;rparams.topMargin *= scalePxY;rparams.rightMargin *= scalePxX;rparams.bottomMargin *= scalePxY;} else if (params instanceof AbsoluteLayout.LayoutParams) {AbsoluteLayout.LayoutParams rparams = (AbsoluteLayout.LayoutParams) params;rparams.x *= scalePxX;rparams.y *= scalePxY;}dst.setLayoutParams(params);dst.postInvalidate();}public void screenAdapted(View dst) {sizeAdapted(dst);positionAdapted(dst);}public float getScalePxX() {return scalePxX;}public float getScalePxY() {return scalePxY;}public float getScaleDpi() {return scaleDpi;}public void setScaleDpi(float scaleDpi) {this.scaleDpi = scaleDpi;}}


0 0
原创粉丝点击