Android 간단 하고 사용 하기 좋 은 화면 어댑터

안 드 로 이 드 의 dp 는 렌 더 링 전에 dp 를 px 로 바 꾸 고 계산 공식:
  • px = density * dp;
  • density = dpi / 160;
  • px = dp * (dpi / 160);
  • 일반적으로 우리 의 설계 도 는 모두 고정된 사이즈 로 설계 된다.예 를 들 어 해상도 1920 px*1080 px 로 디자인 하고 density 를 3 으로 표시 합 니 다.즉,화면 은 640 dp*360 dp 입 니 다.만약 에 우리 가 모든 설비 에 완전히 일치 하 는 것 을 나타 내 려 면 현실 적 이지 않다.스크린 의 높이 와 너비 가 고정 적 이지 않 기 때문에 16:9,4:3 심지어 다른 너비 와 높이 가 끊임없이 나타 나 고 너비 와 높이 가 다 르 며 표시 가 완전히 일치 하면 불가능 하 다.똑 같은 해상도 의 서로 다른 업 체 의 핸드폰 화면 밀도 도 다 르 더 라 도 우 리 는 통일 을 해 야 한다.
    화면 을 맞 추 려 면 공식 을 하나 알 아 보 겠 습 니 다.
    dp 와 px 의 변환 공식:
  • px = dp * density
  • 이 를 통 해 알 수 있 듯 이 설계도 폭 이 360 dp 이 고 모든 장치 에서 계 산 된 px 값 이 화면 너비 임 을 확보 하려 면 density 의 값 을 수정 하여 효 과 를 얻 을 수 있 습 니 다.density 는 DisplayMetrics 의 구성원 변수 이 며,DisplayMetrics 인 스 턴 스 는 Resources.getDisplayMetrics 를 통 해 얻 을 수 있 으 며,Resources 는 Activity 나 Application 의 Context 를 통 해 얻 을 수 있 습 니 다.
    DisplayMetrics 와 어댑터 와 관련 된 몇 가지 변수:
  • DisplayMetrics.density 는 상기 density
  • 이다.
  • DisplayMetrics.densityDpi 는 상기 dpi
  • 입 니 다.
  • DisplayMetrics.scaled Density 글꼴 의 크기 조정 인 자 는 정상 적 인 상황 에서 density 와 같 지만 시스템 글꼴 크기 를 조절 하면 이 값 이 변 경 됩 니 다
  • 우 리 는 어떤 단위 시스템 을 설정 하 든 결국 px 로 전환 하여 시스템 의 변환 코드 를 계산 해 볼 것 이라는 것 을 안다.
  • TypedValue.application(int unit,float value,DisplayMetrics metrics)를 변환 합 니 다.
  • 
        public static float applyDimension(int unit, float value,DisplayMetrics metrics)
        {
            switch (unit) {
            case COMPLEX_UNIT_PX:
                return value;
            case COMPLEX_UNIT_DIP:
                return value * metrics.density;
            case COMPLEX_UNIT_SP:
                return value * metrics.scaledDensity;
            case COMPLEX_UNIT_PT:
                return value * metrics.xdpi * (1.0f/72);
            case COMPLEX_UNIT_IN:
                return value * metrics.xdpi;
            case COMPLEX_UNIT_MM:
                return value * metrics.xdpi * (1.0f/25.4f);
            }
            return 0;
        }
    
    그림 의 decode,BitmapFactory.decodeResource Stream 방법
    
    	    @Nullable
        public static Bitmap decodeResourceStream(@Nullable Resources res, @Nullable TypedValue value,
                @Nullable InputStream is, @Nullable Rect pad, @Nullable Options opts) {
            validate(opts);
            if (opts == null) {
                opts = new Options();
            }
    
            if (opts.inDensity == 0 && value != null) {
                final int density = value.density;
                if (density == TypedValue.DENSITY_DEFAULT) {
                    opts.inDensity = DisplayMetrics.DENSITY_DEFAULT;
                } else if (density != TypedValue.DENSITY_NONE) {
                    opts.inDensity = density;
                }
            }
            
    	//      densityDpi
            if (opts.inTargetDensity == 0 && res != null) {
                opts.inTargetDensity = res.getDisplayMetrics().densityDpi;
            }
            
            return decodeStream(is, pad, opts);
        }
    
    만약 에 우리 가 기본 값 으로 360 dp 의 화면 을 기준 으로 디자인 한다 면 view 의 너 비 를 화면의 절반 으로 설정 하려 면 180 dp 이 고 1080*1920 의 화면 에 540 px 가 있어 야 합 니 다.계산 에 통과 하 다
  • density = 1080/360;desity = 3
  • Typed Vaule.apply Dimens 로 환산 하면 180 dp*3=540 px 입 니 다.720*1280 화면 절반 너비 가 360 px 라면 계산 할 수 있 습 니 다.
  • density = 720/360,density = 2;
  • TypedVaule.apply Dimens 로 환산 하면 180 dp*2=360 px
    그래서 우 리 는 최종 실현 방안 은 다음 과 같다.
    
        private static final float defaultWidth = 360;
        private static float appDensity;
        private static float appScaleDensity;
    
        public static void setCustomDensity(Application application, Activity activity){
            DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
            if (appDensity == 0){
                appDensity = displayMetrics.density;
                appScaleDensity = displayMetrics.scaledDensity;
    	        //             
                application.registerComponentCallbacks(new ComponentCallbacks() {
                    @Override
                    public void onConfigurationChanged(@NonNull Configuration newConfig) {
                        if (newConfig != null && newConfig.fontScale >0){
                            appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
                        }
                    }
    
                    @Override
                    public void onLowMemory() {
    
                    }
                });
            }
            final float targetDensity = displayMetrics.widthPixels/defaultWidth;
            final float targetScaleDensity = targetDensity *(appScaleDensity/appDensity);
            final int  targetDensityDpi = (int) (targetDensity * 160);
            displayMetrics.density = targetDensity;
            displayMetrics.scaledDensity = targetScaleDensity;
            displayMetrics.densityDpi = targetDensityDpi;
            final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
            activityDisplayMetrics.density = targetDensity;
            activityDisplayMetrics.scaledDensity = targetScaleDensity;
            activityDisplayMetrics.densityDpi = targetDensityDpi;
        }
    
    항목 에서 사용:
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //          setContentView  
    	DensityHelper.setCustomDensity(getApplication(),this);
            setContentView(R.layout.activity_main);
        }
    
    부족 한 점 이 있 으 면 모두 에 게 지적 하고 함께 공부 하 자.
    이상 은 안 드 로 이 드 가 간단 하고 사용 하기 좋 은 화면 어댑터 방안 의 상세 한 내용 입 니 다.안 드 로 이 드 화면 어댑터 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기