오늘 톱기사의 안드로이드 적합 방안은 소장할 만하다

문장 링크는 이전에 접촉한 적이 없다. 내가 간단하게 한 번 봤는데 이것도 비교적 완벽한 방안이라고 할 수 있다. 내가 먼저 이 방안의 사고방식을 간단하게 말하자면 이것은density값을 수정하고 서로 다른 사이즈의 해상도 휴대전화의 너비 dp값을 통일된 값으로 강제로 바꾸는 것이다. 이렇게 하면 모든 적합 문제를 해결할 수 있다.
예를 들어 디자인 원고의 폭이 360px라면 개발 쪽에서 목표 dp값을 360dp로 설정하고 서로 다른 장치에서density값을 동태적으로 수정하여 px/density라는 값이 시종 360dp임을 보장한다. 그러면 UI가 서로 다른 장치에서 일치하도록 보장할 수 있다.
이 방안은 침입성이 매우 낮고 개인 API와 관련이 없기 때문에 아주 좋은 방안일 것이다. 나는 density를 강제로 수정하는 것이 다른 영향을 미칠지 당분간 생각하지 못했다. 오늘의 톱공장이 사용하고 있는 이상 안정성은 보장되어야 한다.
그러나 내 관찰에 의하면 이 방안은 오래된 프로젝트에 그다지 우호적이지 않다. 시스템의density값을 수정한 후에 전체 레이아웃의 실제 사이즈가 바뀔 수 있기 때문이다. 만약에 오래된 프로젝트 파일에서 사용하려면 전체 레이아웃 파일의 사이즈는 디자인 원고에 따라 다시 한 번 수정해야 할 것 같다.따라서 오래된 프로젝트를 유지하거나 개조하고 있다면 이 방안을 사용하면 심사숙고해야 한다.
구체적인 코드는 다음과 같습니다.
    //            
    //     density ,                  dp         ,             
    // @param activity
    // @param application

    private static float sNoncompatDensity;
    private static float sNoncompatScaledDensity;
    public static void setCustomDensity(@NonNull Activity activity, @NonNull final Application application){
        DisplayMetrics appDisplayMetrics=application.getResources().getDisplayMetrics();
        if (sNoncompatDensity==0){
            sNoncompatDensity=appDisplayMetrics.density;
            sNoncompatScaledDensity=appDisplayMetrics.scaledDensity;
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    if (newConfig!=null&&newConfig.fontScale>0){
                        sNoncompatScaledDensity=application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }

                @Override
                public void onLowMemory() {

                }
            });
        }
        float targetDensity=appDisplayMetrics.widthPixels/360;
        float targetScaleDensity=targetDensity*(sNoncompatScaledDensity/sNoncompatDensity);
        int targetDensityDpi=(int)(160*targetDensity);
        appDisplayMetrics.density=targetDensity;
        appDisplayMetrics.scaledDensity=targetScaleDensity;
        appDisplayMetrics.densityDpi=targetDensityDpi;

        final DisplayMetrics activityDisplayMetrics=activity.getResources().getDisplayMetrics();
        activityDisplayMetrics.density=targetDensity;
        activityDisplayMetrics.scaledDensity=targetScaleDensity;
        activityDisplayMetrics.densityDpi=targetDensityDpi;
    }

좋은 웹페이지 즐겨찾기