안드로이드 화면 맞춤 글꼴

6935 단어 옮겨 싣다
먼저 그들의 기본 개념을 살펴보자.
px: 화면의 픽셀점 dp:density 기반의 추상적인 단위입니다. 160dpi 화면이면 1dp=1px dip: dp sp와 같습니다. dp와 비슷하지만 사용자의 글꼴 크기에 따라 축소할 수 있습니다.
 
dip와 px의 관계에 대해 다음과 같이 요약합니다.
1). px 픽셀:
하나의 픽셀은 일반적으로 이미지의 가장 작은 완전한 샘플로 여겨지는데, 이것은 비교적 많이 사용된다. 특히 웹 개발에서 페이지는 기본적으로 픽셀을 단위로 사용한다.
2). dip 또는 dp(device independent pixels):
장치 독립형 픽셀 - 장치 하드웨어와 관련하여 일반적으로 우리는 휴대전화의 다양한 해상도, 예를 들어 WVGA, HVGA를 지원하기 위해
및 QVGA는 dip을 길이 단위로 사용합니다.
다음은 핸드폰 화면 유형과 밀도, 해상도의 대응 관계를 살펴보겠습니다.
QVGA 화면 density=120 QVGA(240*320) HVGA 화면 density=160 HVGA(320*480) WVGA 화면 density=240 WVGA(480*800) WQVGA 화면 density=120 WQVGA(240*400)
 
주:density 값은 인치당 몇 개의 디스플레이 포인트가 있는지 표시하고 해상도와는 두 가지 개념이다.
 
density에 따라 화면 해상도 정보가 다르다. 480dip*800dip의 WVGA(density=240)를 예로 들면
1、density=120시
전환: 전환 계수 = 120/240
화면 실제 해상도는 240px*400px(두 개의 점이 하나의 해상도에 대응함)
상태 표시줄과 제목 표시줄 높이 각각 19px 또는 25dip
가로 화면은 400px 또는 800dip, 작업 영역 높이는 211px 또는 480dip
세로 화면 240px 또는 480dip, 작업 영역 높이 381px 또는 775dip 2, density=160일 때
전환: 전환 계수 = 160/240
화면 실제 해상도는 320px*533px(3개의 점이 두 개의 해상도에 해당)
상태 표시줄 및 제목 표시줄 높이 25px 또는 25dip
가로 화면은 533px 또는 800dip, 작업 영역 높이 295px 또는 480dip
세로 화면 320px 또는 480dip, 작업 영역 높이 508px 또는 775dip 3, density=240일 때
전환: 전환 계수 = 240/240
화면의 실제 해상도는 480px*800px(점당 해상도)
상태 표시줄 및 제목 표시줄 높이 38px 또는 25dip
가로 화면은 800px 또는 800dip, 작업 영역 높이 442px 또는 480dip
세로 화면 폭 480px 또는 480dip, 작업 영역 높이 762px 또는 775dip
drawable-ldpi: 화면 밀도가 120인 휴대전화 장치
drawable-mdpi: 화면 밀도가 160인 휴대전화 장치(이것은 베이스라인이고 나머지는 이를 기준으로 이 장치에서 1dp=1px)
drawable-hdpi: 화면 밀도 240의 휴대전화 장치
drawable-xhdpi: 화면 밀도 320의 휴대전화 장치
drawable-xxhdpi: 화면 밀도 480의 휴대전화 장치
(values도 마찬가지입니다. 물론 주의해야 할 점은 다음과 같습니다. values와values-hdpi 효과는 같고drawable와drawable-hdpi 효과도 같기 때문에 일반적으로 우리는 이 두 폴더에 저장한 값이 똑같습니다. 만약 두 개가 모두 있다면 어울리는 것이 좋습니다.)
apk의 자원 패키지 중
화면density=240일 때 hdpi 탭의 자원을 사용합니다
화면density=160에서mdpi 탭의 자원을 사용합니다
화면density=120일 때ldpi 탭의 자원을 사용합니다
화면density=320에서 xhdpi 탭의 자원을 사용합니다
화면density=480에서 xxhdpi 탭의 자원을 사용합니다
레이블이 없는 리소스는 다양한 해상도에서 공통 사용
따라서 레이아웃할 때 단위 dip을 사용하고 pxdp와 px 환산 공식을 적게 사용한다. pixs=dips*(densityDpi/160).  dips=(pixs*160)/densityDpi
그러나 우리가 코드에서 전환을 진행할 때 0.5f의 편이값이 필요하다
private static final float scale = mContext.getResources().getDisplayMetrics().density;
 
private static final float scaledDensity = mContext.mContext.getResources().getDisplayMetrics().scaledDensity;
 
/**
 * dp  px
 * @param dipValue
 * @return
 */
public static int dip2px(float dipValue) {
	return (int) (dipValue * scale + 0.5f);
}
 
/**
 * px  dp
 * @param pxValue
 * @return
 */
public static int px2dip(float pxValue) {
	return (int) (pxValue / scale + 0.5f);
}
 
/**
 * sp  px
 * @param spValue
 * @param type
 * @return
 */
public static float sp2px(float spValue, int type) {
	switch (type) {
	case CHINESE:
		return spValue * scaledDensity;
	case NUMBER_OR_CHARACTER:
		return spValue * scaledDensity * 10.0f / 18.0f;
	default:
		return spValue * scaledDensity;
	}
}

우리가 보기에 이곳의 scale는 이 종류의 Display Metrics에서 정의한 전역 변수이다. 사실 이 값은 현재 휴대전화의density/160이다. scale Density는 px와 sp 간의 전환과 scale의 차이가 많지 않다.그리고 하나는 여기 전환이 오프셋 처리가 있어요.
위에서 전재한 내용:https://blog.csdn.net/jiangwei0910410003/article/details/40509571
====================================분할선=============================================================
안드로이드 스크린 어댑터 프로젝트는 dp와 sp로 직접 변경할 필요가 없이 코드 한 마디를 추가하면 어댑터를 실현할 수 있다
호환성 문제와 성능 문제가 있는지 확인하기 위해 시간이 걸립니다.
현재 시뮬레이터의 해상도와 dpi의 기본 효과는 크게 떨어지지 않을 것으로 테스트되었다
화면 레이아웃을 회전하면 가로 크기로 확대/축소되고 흐트러지지 않습니다.
package com.dzw.demo.utils;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.view.WindowManager;

import static android.content.Context.WINDOW_SERVICE;

public class ScreenAdaptation {

    private Application.ActivityLifecycleCallbacks activityLifecycleCallbacks;

    private Application mApplication;

    private float mWidth = 720;

    private float mHeight = 1280;

    public ScreenAdaptation(Application application, float width, int height) {

        mApplication = application;

        mWidth = width;

        mHeight = height;

        activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {

            @Override

            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {


                //  Activity   

                resetDensity(activity, mWidth, mHeight);

            }

            @Override

            public void onActivityStarted(Activity activity) {

            }

            @Override

            public void onActivityResumed(Activity activity) {

            }

            @Override

            public void onActivityPaused(Activity activity) {

            }

            @Override

            public void onActivityStopped(Activity activity) {

            }

            @Override

            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override

            public void onActivityDestroyed(Activity activity) {

            }

        };

    }

    /**
     *   
     */

    public void register() {

        resetDensity(mApplication, mWidth, mHeight);

        mApplication.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);

    }

    /**
     *   
     */

    public void unregister() {
        //     

        mApplication.getResources().getDisplayMetrics().setToDefaults();

        mApplication.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);

    }

    /**
     * dp  getResources().getDisplayMetrics().density
     * 

* sp getResources().getDisplayMetrics().scaledDensity *

* pt getResources().getDisplayMetrics().xdpi * * @paramcontext * @paramwidthui * @paramheightui */ private static void resetDensity(Context context, float width, float height) { Point point = new Point(); // ((WindowManager) context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getSize(point); //dp getResources().getDisplayMetrics().density context.getResources().getDisplayMetrics().density = point.x / width * 2f; context.getResources().getDisplayMetrics().density = point.y / height * 2f; //sp getResources().getDisplayMetrics().scaledDensity context.getResources().getDisplayMetrics().scaledDensity = point.x / width * 2f; context.getResources().getDisplayMetrics().scaledDensity = point.y / height * 2f; } }


 
Application의 onCreate에서 호출하려면:
new ScreenAdaptation(this,720,1280).register();

위에서 전재한 내용:https://www.jianshu.com/p/97b107308923

좋은 웹페이지 즐겨찾기