ImageView에는 adjustViewBounds라는 속성이 있다. 

adjustViewBounds

adjustViewBounds는 src로 추가된 이미지의 원래 비율을 계산해서 ImageView의 높이가 결정된다.

주의할 점은 이미지의 height은 wrap_content여야 높이를 비율에 맞게 설정할 수 있고,

background가 아닌 src로 drawable이미지를 추가해야 한다.


더보기

안드로이드 기기 호환성

안드로이드는 휴대 전화에서 태블릿, TV에 이르기까지 다양한 유형의 기기에서 실행되도록 설계되었다. 앱이 이러한 모든 기기에서 성공하려면 일부 기능 변동을 허용하고 다양한 화면 구성에 적응할 수 있는 유연한 인터페이스를 제공해야한다. 이러한 목표를 향한 노력을 돕기 위해 Android는 정적 파일(예: 화면 크기에 따라 다른 XML 레이아웃)로 구성 별 앱 리소스를 제공할 수 있는 동적 앱 프레임 워크를 제공한다. 그런 다음 Android는 현재 기기 구성에 따라 적절한 리소스를 로드한다. 따라서 일부 앱 디자인 및 추가 앱 리소스를 고려하여 다양한 장치에서 최적화 된 사용자 환경을 제공하는 단일 애플리케이션 패키지(APK)를 게시 할 수 있다.

 

그러나 필요한 경우 앱의 기능 요구 사항을 지정하고 Google Play 스토어에서 앱을 설치할 수 있는 기기유형을 제어할 수 있다. 이 페이지에서는 앱에 액세스할 수 있는 장치를 제어하는 방법과 올바른 대상에 도달하도록 앱을 준비하는 방법에 대해 설명한다. 

 

"호환성"이란 무엇인가? 

Android개발에 대한 자세한 내용을 읽으면 다양한 상황에서 "호환성"이라는 용어가 나타날 수 있다. 호환성에는 장치 호환성과 앱 호환성의 두가지 유형이 있다. Android는 오픈 소스 프로젝트이므로 모든 하드웨어 제조업체는 Android운영체제를 실행하는 장치를 구축 할 수 있다. 그러나 기기는 Android 실행 환경 용으로 작성된 앱을 올바르게 실행할 수 있는 경우에만 "Android 호환"이다. Android 실행 환경의 정확한 세부 사항은 Android 호환성 프로그램에의해 정의되며 각 디바이스는 호환 가능한 것으로 간주 되려면 호환성 테스트 스위트(CTS)를 통과해야한다.

 

앱 개발자는 Android 호환기기만 Google Play Store를 포함하므로 기기가 Android와 호환되는지 여부에 대해 걱정할 필요가 없다. 따라서 Google Play Store에서 앱을 설치하는 사용자는 Android호환 기를 사용하고 있으므로 안심할 수 있다.

//

그러나 앱이 각 잠재적 장치 구성과 호환 되는지 여부를 고려해야한다. Android는 광범위한 기기 구성에서 실행되므로 일부 기기에서는 일부 기능을 사용할 수 없다. 예를 들어 일부 장치에는 나침반 센서가 포함되어 있지 않을 수 있지만 앱의 핵심 기능에 나침반 센서를 사용해야 하는 경우 앱은 나침반 센서가 포함되어있지 않을 수 있다. 햅의 핵심 기능에 나침반 센서를 사용해야하는 경우 앱은 나침반 센서가 포함된 장치에만 호환된다.

......

Reference

https://developer.android.com/guide/practices/compatibility?hl=ko

 

 

 

 

리사이클러 뷰에서 아이템을 클릭했을 때, 아이템의 데이터를 가지고 새로운 액티비티에 보여주려고 한다.

이 때, 아이템이 점점 커져 화면 전체를 차지해서 보여지도록 만드는게 목표였다.

공부 중에 "android:transitionName" 속성을 이용한 애니메이션 효과를 주면 만들수 있을 것 같았다. 

그래서 먼저, itemView를 클릭했을 때, 새로운 액티비티로 넘어가는 코드를 만들었다.

다음으로 android:transitionName 속성을 itemView와 액티비티에 같은 이름으로 선언하면, 액티비티에서 transitionName속성을 가진 뷰를 시작으로 점점 커지면서 화면을 채워가며 액티비티화면을 보여주게 된다.

반대로 액티비티를 종료할 때는 줄어들면서 화면이 사라진다.

 

이 때, 액티비티 화면에서는 itemView에서 보여주던 것 보다 더 많은 걸 보여주는데, 화면이 커질 때 부터 보여줘서 보기 좋지 않은 상태가 되었다.

 

처음에는 ConstraintLayout에서 뷰를 Group으로 묶을 수 있는 기능이 있어서 Group으로 원하는 부분을 묶고, 이곳에 android:transitionName 속성을 주면 되지 않을까 생각했는데 어림도 없었다.

 

두번 째로는 android:transitionName 속성의 위치를 이동시켰다. 뒤로가기 버튼으로 이동시키자 뒤로가기 버튼부터 화면이 커지기 시작하고 뒤로가기 버튼으로 작아지는 것을 확인했고, android:transitionName 속성을 itemView의 맨앞에 보여지는 title을 보여주는 텍스트뷰에 android:transitionName 속성을 지정해줬더니 텍스트뷰를 기준으로 액티비티화면이 커지고 작아졌다.

아직 조금 아쉽지만 작아질 때 뒤로가기 버튼이나 itemView에서 안보이던 부분들이 보여지는 문제가 남아있었다. 그래서 액티비티를 벗어날 때 itemView에 안보이던 것들을 뷰에서 안보이도록 설정을 바꿔주었더니 원하는 방향이 완성되었다.

 

 

머티리얼 디자인 앱의 액티비티 전환은 움직임과 변환을 통해 서로 다른 상태 간의 시각적 연결을 제공한다. 입력 및 종료 전환과 작업 간 공유 요소의 전환에 대한 사용자 정의 애니메이션을 지정할 수 있다.

 

진입(enter) 전환은 액티비티의 뷰가 장면으로 들어가는 방법을 결정한다. 예를 들어, explode 전환으로 들어갈 때, 뷰가 외부에서 장면으로 들어가 화면 중앙을 향해 날아든다.

 

종료(exit) 전환은 액티비티의 뷰가 장면으로 들어가는 방법을 결정한다. 예를 들어, explode exit 전환에서, 뷰는 화면을 중앙에서 멀리 벗어난다.

 

공유 요소(shared elements) 전환은 두 액티비티 사이에 공유되는 관점이 이들 액티비티 사이에 어떻게 전환되는지를 결정한다. 예를 들어, 두 액티비티가 서로 다른 위치와 크기로 동일한 이미지를 갖는 경우, ChangeImageTransform 공유 요소 전환은 이러한 액티비티 사이에서 이미지를 원활하게 변환하고 스케일을 조정한다. 

 

안드로이드에서 진입(enter)와 종료(exit)전환을 지원한다.

  • explode - 뷰를 화면 중심으로 이동하거나 벗어나게 한다.
  • slide - 뷰를 화면의 가장자리로 이동하거나 벗어나게 한다.
  • fade - 화면을 투명, 불투명하게 바꿈으로 화면에서 제거하고 추가한다.

Visibility 클래스를 상속하는 모든 전환은 진입(enter) 또는 종료(exit) 전환을 지원한다.

자세한 내용은 Transition 클래스에 대한 API에서 확인할 수 있다.

 

안드로이드는 공유 요소(shared elements) 전환도 지원한다.

  • ChagneBounds - 대상 뷰의 layout bounds 변경 애니메이션
  • ChangeClipBounds - 대상 뷰의 clip bounds 변경 애니메이션
  • ChangeTransform - 대상 뷰의 scale 및 rotation의 변화 애니메이션
  • ChangeImageTransform - 대상 이미지의 size 및 scale 변경 애니메이션

앱에서 액티비티 전환을 활성화하면, 기본으로 cross-fading 전환이 활성화된다.

 

액티비티 전환 API는 Android 5.0(API 21)이상에서 사용할 수 있다. 이전 버전의 Android와의 호환성을 유지하려면 API를 호출하기 전에 런타임에 시스템 버전을 확인해야한다.

// Check if we're running on Android 5.0 or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Apply activity transition
} else {
    // Swap without transition
}

사용자(Custom) 지정 전환

첫째, 머티리얼 테마에서 상속되는 스타일을 정의할 때 android:windowActivityTransitions 속성을 사용하여 화면 내용 전환을 사용하도록 설정한다. 또한 스타일 정의에서 진입(enter), 종료(exit) 및 공유 요소(shared element)전환을 지정할 수도 있다.

<style name="BaseAppTheme" parent="android:Theme.Material">
  <!-- enable window content transitions -->
  <item name="android:windowActivityTransitions">true</item>

  <!-- specify enter and exit transitions -->
  <item name="android:windowEnterTransition">@transition/explode</item>
  <item name="android:windowExitTransition">@transition/explode</item>

  <!-- specify shared element transitions -->
  <item name="android:windowSharedElementEnterTransition">
    @transition/change_image_transform</item>
  <item name="android:windowSharedElementExitTransition">
    @transition/change_image_transform</item>
</style>

이 예에서 chagne)image_transform 전환은 다음과 같이 정의한다.

<!-- res/transition/change_image_transform.xml -->
<!-- (see also Shared Transitions below) -->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
  <changeImageTransform/>
</transitionSet>

ChangeImageTransform 요소는 ChangeImageTransform 클래스에 해당한다. 

더보기

ChangeImageTransform 클래스는 API level 21부터 추가되었다. 이 전환은 화면 변경 전후에 ImageView의 매트릭스를 캡처하고 전환 중에 애니메이션한다. ChangeImageTransform은 ChangeBounds와 함께 크기, 모양 또는 ImageView를 변경할 수 있다. ScaleType을 사용하여 컨텐츠를 원활하게 애니메이션할 수 있다. 

대신 코드에서 창 내용 전환을 활성화하려면 Window.requestFeature()함수를 호출한다.

 

 

 

+ Recent posts