안 드 로 이 드 스킨 케 어 기술 자료 정리

안 드 로 이 드 스킨 케 어 기술 총화
배경
현재 각종 Android app 을 살 펴 보면 피부 교환 수 요 는?
-낮/밤 테마 전환(또는 다른 이름,보통 2 세트),화 순/셀 프 주식/매일 듣 기 등 UI 는 하나의 switcher 로 표현.
-QQ/QQ 공간 과 같은 다양한 테마 전환 이 가능 합 니 다.
첫 번 째 로 볼 때 눈대중 은 로 컬 theme 을 통 해 직접 해 야 합 니 다.즉,모든 그림/색상 의 자원 이 apk 에서 포장 되 었 습 니 다.
두 번 째 는 상대 적 으로 복잡 하 다.온라인 서비스 로 서 새로운 피 부 를 올 릴 수 있 고 그 많은 피부 팩 을 apk 에 넣 으 면 부피 가 너무 크기 때문에 피부 자원 은 선택 한 후에 다운로드 할 수 있 고 안 드 로 이 드 의 테 마 를 직접 사용 할 수 없다.
기술 안
내부 자원 로드 방안 과 동적 다운로드 자원 다운로드 두 가지.
동적 다운 로드 는 일종 의 블랙 테 크 놀 로 지 라 고 할 수 있 습 니 다.hack 시스템 의 일부 방법 이 필요 하기 때문에 일부 기종 과 새로운 API 에 가끔 구덩이 가 있 을 수 있 지만 상대 적 으로 좋 은 점 은 많 습 니 다.
-그림/색 값 등 자원 은 배경 에서 보 내 는 것 이기 때문에 수시로 업데이트 가능
-APK 부피 감소
-애플 리 케 이 션 개발 자 에 게 스킨 케 어 는 거의 투명 하 므 로 몇 가지 피부 에 신경 쓰 지 않 아 도 됩 니 다.
-부가 가치 서비스 로 팔 수 있다!!
내부 자원 로드 방안
내부 자원 로드 는 모두 안 드 로 이 드 자체 의 theme 를 통 해 이 루어 집 니 다.업무 개발 에 비해 작업량 이 더 많 습 니 다(attr 와 theme 를 정의 해 야 합 니 다).서로 다른 방안 은 BaseActivity 에서 setTheme 을 하 는 것 과 유사 합 니 다.차 이 는 주로 다음 과 같은 두 가지 문 제 를 해결 하 는 전략 입 니 다.
-setTheme 이후 페이지 를 다시 만 들 지 않 고 실시 간 으로 새로 고침 하 는 방법(특히 listview 의 item).
-어떤 뷰 를 새로 고침 해 야 하 는 지,어떤 뷰 를 새로 고침 해 야 하 는 지(배경?글꼴 색상?ImageView 의 src?).
사용자 정의 뷰
MultipleTheme
사용자 정의 view 를 만 드 는 것 은 setTheme 후에 바로 새로 고침 하기 위해 서 입 니 다.페이지 UI 에 대응 하 는 자원(예 를 들 어 TextView 가 배경 그림 과 텍스트 색 을 바 꾸 는 것)을 업데이트 합 니 다.상기 항목 에 서 는 rootView 를 옮 겨 다 니 며 ColorUi Interface 를 실현 한 view/view group 에 대해 setTheme 작업 을 하여 새로 고침 을 하 더 라 도 이 루어 집 니 다.
분명히 이것 은 너무 무 거 워 서 응용 프로그램의 각종 view/viewgroup 를 교체 해 야 한다.
view 와 변경 할 자원 형식 을 수 동 으로 연결 합 니 다.
Colorful
이거...사용법 좀 봅 시다...

ViewGroupSetter listViewSetter = new ViewGroupSetter(mNewsListView);
//   ListView Item View  news_title  ,        text_color  
listViewSetter.childViewTextColor(R.id.news_title, R.attr.text_color);

//   Colorful     View        
mColorful = new Colorful.Builder(this)
  .backgroundDrawable(R.id.root_view, R.attr.root_view_bg)
  //   view     
  .backgroundColor(R.id.change_btn, R.attr.btn_bg)
  //      
  .textColor(R.id.textview, R.attr.text_color)
  .setter(listViewSetter) //     setter
  .create(); //       

피 부 를 바 꾸 려 면 activity 에서 어떤 view 의 속성 을 바 꿀 지,어떤 attribute 에 대응 할 지 스스로 설정 해 야 합 니 다.원가 가 너무 비 싼 거 아니 야?그리고 activity 의 논리 도 엉망 이 되 기 쉽다.
동적 자원 로드 방안
리 소스 교체
application 을 덮어 쓰 는 getResource 방법 은 자신의 resource 를 실현 하고 로 컬 스킨 백 폴 더 에 있 는 자원 팩 을 우선 불 러 옵 니 다.성능 문제 에 대해 서 는 attribute 나 자원 이름 규범(스킨 을 바 꾸 려 면 skin시작)피부 가 바 뀌 지 않 는 자원 에 대한 추가 검사 비용 을 최적화 시킨다.
그러나 Android 5.1 소스 코드 에서 drawable 을 초기 화 할 때 resource.getDrawable 이 아 닌 loadDrawable 을 사용 합 니 다.loadDrawable 은 개인 적 인 방법 으로 덮어 쓸 수 없 기 때문에 편리 하지만 계속 사용 할 수 없습니다.(피부 와 관련 된 일 에 신경 쓰 지 마 세 요.android:color 는 색상 을 지정 하면 됩 니 다.신기 한 방울 은 자동 으로 피 부 를 바 꿉 니 다)
사용자 정의 LayoutInflator.Factory
오픈 소스 프로젝트 는 안 드 로 이 드-스킨-로 더 를 참조 할 수 있 습 니 다.
즉,setFactory 는 사용자 정의 LayoutInflator.Factory 를 사용 하여 이 프로젝트 의 SkinInflaterFactory 와 SkinManager(자신의 getColor,getDrawable,getBitmap,getColorStateList 등 방법 을 실현 하 였 음)를 중점적으로 주목 할 수 있 습 니 다.
예 를 들 어 app:custom Style 을 사용자 정의 하고 모든 style 을 다시 쓰 며 set 방법 으로 전환 해 야 합 니 다.이런 희생 은 바로 스킨 케 어 비용 을 증가 시 키 는 것 입 니 다.많은 style 을 써 야 합 니 다.스스로 set 를 해 야 합 니 다.완전히 투명 하지 않 습 니 다.
Hack Resources internally
블랙 테 크 놀 로 지 방법,리 소스 에 대한 직접 hack,리 소스.자바:

// Information about preloaded resources. Note that they are not
// protected by a lock, because while preloading in zygote we are all
// single-threaded, and after that these are immutable.
private static final LongSparseArray<Drawable.ConstantState>[] sPreloadedDrawables;
private static final LongSparseArray<Drawable.ConstantState> sPreloadedColorDrawables
  = new LongSparseArray<Drawable.ConstantState>();
private static final LongSparseArray<ColorStateList> sPreloadedColorStateLists
  = new LongSparseArray<ColorStateList>();
Resources 에 있 는 이 세 개의 LongSparseArray 를 직접 교체 합 니 다.apk 가 실 행 될 때 자원 은 모두 이 세 개의 배열 에서 불 러 오기 때문에 interceptor 모드 만 사용 하면 됩 니 다.

public class DrawablePreloadInterceptor extends LongSparseArray<Drawable.ConstantState>
자신 이 LongSparseArray 를 실현 하고 반사 set 를 통 해 돌아 가면 스킨 케 어 를 실현 할 수 있 습 니 다.구체 적 인 getDrawable 등 방법 에서 preload 배열 을 어떻게 취 하 는 지 자원 의 소스 코드 를 직접 볼 수 있 습 니 다.
잠깐 만,이렇게 간단 해?NONO,소년 당신 은 너무 순진 합 니 다.xml 를 어떻게 불 러 오 는 지,9patch 의 padding 을 어떻게 업데이트 하 는 지,사용자 정의 스킨 백 을 어떻게 포장/불 러 오 는 지,drawable 상 태 를 어떻게 새로 고침 하 는 지 등등.이것 은 모두 당신 이 고려 해 야 할 것 입 니 다.플러그 인 이 존재 하 는 app 에서 서로 resource id 를 덮어 쓸 지 여 부 를 고려 해 야 합 니 다.더 나 아가 apt 를 수정 하고 resource id 를 2 개의 range 에 배치 해 야 합 니 다.
손 Q 와 독립 판 QQ 공간 은 이런 방안 을 사용 해 효과 가 좋다.
총결산
동적 로드 방안 이 흑 과학기술 에 비해 시스템 API 변경 으로 인해 문제 가 생 길 수 있 지만 상대 적 으로
좋 은 점 이 있다
-유연성 이 높 아 백 스테이지 에서 수시로 피부 팩 을 업데이트 할 수 있 음
-상대 적 으로 투명 하고 개발 자 들 은 몇 가지 피부 에 관심 이 없고 각종 theme 와 attr 를 정의 하지 않 아 도 되 며 심지어 스킨 팩 의 포장 도 디자인 이나 전문 적 인 친구 에 게 맡 길 수 있 습 니 다.
-apk 부피 절감
존재 하 는 문제
완벽 한 오픈 소스 프로젝트 가 없습니다.만약 에 저희 가 동적 으로 불 러 오 는 두 번 째 방안 을 사용한다 면 필요 한 프로젝트 기능 은 다음 과 같 습 니 다.
-사용자 정의 스킨 팩 구조
-스킨 체인 지 엔진,스킨 팩 자원 로드,실시 간 리 셋.
-스킨 팩 패키지
-다양한 롬 에 대한 호 환
만약 에 이런 프로젝트 가 있다 면 영원히 편안 해 질 것 입 니 다.관심 있 는 친구 들 은 연락 해서 모두 함께 해 보 세 요.
내부 로드 방안 은 대동소이 하 다.주로 실시 간 으로 새로 고침 하 는 문 제 를 해결 하 는 것 이지 만 현재 의 일부 오픈 소스 프로젝트 를 보면 특별한 간편 한 방안 이 없다.제 가 선택 하면 화면 을 다시 만 들 고 싶 습 니 다.예 를 들 어 activity 를 다시 시작 하거나 reove 모든 view 를 다시 추가 하고 싶 습 니 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기