Android Drawable 필수 지식 소결

15654 단어 AndroidDrawable
Drawable 이 뭐야?
먼저 Drawable 은 Canvas 에서 그 릴 수 있 는 그림 을 나타 내 는 추상 적 인 클래스 로 view 의 배경 으로 자주 사용 되 며 다양한 실현 클래스 가 서로 다른 기능 을 수행 합 니 다.그 다음 에 Drawable 은 크게 다음 과 같은 몇 가지 로 나 눌 수 있다.그림,색채 로 구 성 된 이미지 이다.일반적으로 xml 로 정의 합 니 다.
Drawable 의 계승 시스템

Drawable 구현 클래스 및 태그
Drawable
내부 폭 높 은 획득
    getIntrinsicHeight、getIntrinsicWidth
    - Drawable 이 그림 으로 구성 되 었 을 때 방법 은 그림 의 너비 와 높이 를 되 돌려 줍 니 다.
    -  Drawable 이 색상 으로 구성 되 어 있 을 때 너비 와 높이 개념 없 이 되 돌아 가기-1
각종 Drawable 및 그 용법
BitmapDrawable
그림 을 표시 하 는 데 사용 합 니 다.다음 예제 입 니 다.

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
 android:antialias="true"
 android:dither="true"
 android:filter="true"
 android:gravity="top"
 android:src="@mipmap/girl"
 android:tileMode="repeat" />

상용 속성
android:antialias 톱날 저항 오픈 여부
android:dither 디 더 링 방지 오픈 여부
android:filter 필터 효과 오픈 여부
안 드 로 이 드:gravity 는 그림 을 찾 는 데 사 용 됩 니 다.
android:src 이미지 자원 id
android:tileMode 평평 한 포장 모드,repeat,mirror,clamp 세 가지
ColorDrawable
단색 으로 그 릴 수 있 는 구역 을 대표 하고 고정된 색 을 포장 하여 캔버스 에 단색 구역 을 그립 니 다.
예시:

<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/colorAccent">
</color>

코드 로 도 만 들 수 있어 요.
ColorDrawable drawable = new ColorDrawable(int color); //color 의 integer 값 을 입력 합 니 다.
NinePatchDrawable
즉 9-patch 그림 은 내용 에 따라 너비 와 높이 를 자 유 롭 게 조정 할 수 있 습 니 다.
예시:

<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
 android:dither="true"
 android:filter="true"
 android:src="@color/colorAccent">
</nine-patch>

draw9patch 로 크기 조정 영역 설정
그림 에서 1,2 방향 은 draw9patch 에서 검 은 선 을 그립 니 다.검 은 선 길 이 는 늘 어 날 수 있 는 범위 로 교차 합 니 다.
그림 에서 3,4 방향 검 은 선 길이 의 교 집합 은 내용 이 채 울 수 있 는 구역 을 나타 낸다.

ShapeDrawable
색 채 를 통 해 도형 을 구성 하면 단색 도형 일 수도 있 고 그 라 데 이 션 효 과 를 가 진 도형 일 수도 있다.구성 할 수 있 는 도형 은 rectangle,oval,ring,line 이 있다.
그 라 데 이 션 효과 가 있 는 원 예제:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="oval">
 <gradient
  android:angle="45"
  android:centerColor="@color/colorAccent"
  android:centerX="50%"
  android:centerY="50%"
  android:endColor="@color/colorPrimary"
  android:gradientRadius="150dp"
  android:startColor="@color/colorPrimaryDark"
  android:type="sweep" />
 <size
  android:width="260dp"
  android:height="260dp" />
</shape>

메모:1.Android:angle 값 은 45 의 배수 2,oval 로 타원 을 그립 니 다.size 의 너비 와 높이 가 같 을 때 원 으로 그립 니 다.
라운드 예시:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:innerRadius="100dp"
 android:shape="ring"
 android:thickness="10dp"
 android:useLevel="false" >

 <stroke
  android:width="10dp"
  android:color="@color/colorAccent" />
</shape>

주:
1.android:useLevel 을 false 로 설정 합 니 다.그렇지 않 으 면 이상 적 인 효 과 를 표시 할 수 없습니다.
2.innerRadius 는 원 환 내 반지름 이 고 innerRadiusRation 은 내 반지름 이 원 환 너비 의 비율 을 차지 하 며 이들 은 innerRadius 를 위주 로 한다.
3.thickness 는 링 의 너비 이 고 thickness Ratio 는 이 너비 가 링 너비 의 비율 을 차지 하 며 thickness 를 위주 로 한다.
상용 속성
-android:shape 가 그 릴 모양,rectangle,oval,ring,line
-모양 의 묘사,다음 과 같은 속성 이 있 음
        - android:width 테두리 너비
        - android:color 테두리 색상
        - android:dashGap 점선 너비 그리 기
        - android:dashWidth 점선 의 선분 간격 그리 기(점선 을 그 리 려 면 둘 다 0 이 될 수 없습니다)
-단색 충전,android:color 지정 shape 색상
-그 라 데 이 션 효과,solid 와 함께 사용 할 수 없 음,다음 속성 이 있 음
        - android:angle 그 라 데 이 션 각도,45 배수 여야 합 니 다.
        - android:startColor 그 라 데 이 션 의 시작 색
        - android:centerColor 그 라 데 이 션 의 중간 색상
        - android:endColor 그 라 데 이 션 의 끝 색
        - android:centerX 그 라 데 이 션 의 중심 점 가로 좌표
        - android:centerY 그 라 데 이 션 의 중심 점 세로 좌표
        - android:gradientRadius 그 라 데 이 션 반경
        - android:type 그 라 데 이 션 유형,linear(선형),sweep(스 캔),radial(직경 방향)
-는 사각형(rectangle)의 네 개의 각 도 를 나타 내 며,다른 shape 에 적용 되 지 않 으 며,다음 과 같은 속성 이 있 습 니 다.
        - android:topLeft Radius,android:topRightRadius,android:bottomLeft Radius,android:bottomRightRadius 는 각각 왼쪽 상단,오른쪽 상단,왼쪽 하단,오른쪽 하단 의 각 도 를 설정 합 니 다.
        - android:radius 는 사각 에 같은 각 도 를 설정 하고 우선 순위 가 낮 으 며 다른 네 개의 속성 으로 덮어 씁 니 다.
-shape 의 너비 와 높이 는 android:width,android:height 에 대응 합 니 다.
        -  shape 기본 너비 없 음,getIntrinsicHeight,getIntrinsicWidth 반환-1
        -  size 를 통 해 너비 와 높이 를 설정 할 수 있 지만 view 배경 으로 늘 어 나 거나 view 크기 로 줄 어 듭 니 다.
-shape 를 수용 하 는 view 의 공백 간격 설정
StateListDrawable
상태 선택 기로 볼 수 있 습 니 다.view 의 서로 다른 상 태 를 통 해 해당 하 는 item 의 drawable 디 스 플레이 를 선택 하 십시오.
예시:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@color/colorPrimaryDark" android:state_pressed="false"></item>
 <item android:drawable="@color/colorAccent" android:state_pressed="true"></item>
</selector>

흔 한 상태
android:state_pressed 뷰 를 누 를 때 누 른 상태
android:state_checked  view 가 선택 되 었 을 때 CheckBox 에 적 용 됩 니 다.
android:state_selected  view 가 선택 되 었 을 때
android:state_enabled  view 가 사용 가능 한 상태 에 있 을 때
android:state_focused  뷰 에서 초점 가 져 오기
LayerDeawable
이것 은 층 을 나 누 는 Drawable 집합 을 나타 내 는데 ps 의 그림 과 같은 개념 으로 여러 개의 drawable 을 서로 다른 층 위 에 놓 아 중첩 효 과 를 형성한다.
예시:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@mipmap/night" />
 <item
  android:drawable="@mipmap/photo6"
  android:gravity="center" />
</layer-list>

주의사항:
1.layer-list 는 여러 개의 item 을 포함 할 수 있 습 니 다.각 item 은 drawable 을 표시 하고 추 가 된 item 은 이전에 추 가 된 item 에 덮어 씁 니 다.
2.기본 적 인 상황 에서 layer-list 의 모든 drawable 은 view 크기 로 크기 를 조정 합 니 다.시설 android:gravity 를 통 해 크기 조정 효 과 를 조절 할 수 있 습 니 다.
3.상하 좌우 오프셋 을 설정 할 수 있 습 니 다.android:top,android:bottom,android:left,android:right
LevelListDrawable
drawable 집합 을 표시 합 니 다.집합 에 있 는 모든 Drawable 은 하나의 등급(level)이 있 습 니 다.서로 다른 등급 을 설정 하면 LevelList Drawable 을 다른 Drawable 로 전환 할 수 있 습 니 다.레벨 범 위 는 0~10000 사이,android:maxLevel 최대 level,android:minLevel 최소 level 설정
예시:

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:drawable="@mipmap/photo0"
  android:maxLevel="20"
  android:minLevel="10" />
 <item
  android:drawable="@mipmap/photo1"
  android:maxLevel="40"
  android:minLevel="30" />
</level-list>

level 설정 을 통 해 코드 에서 다른 Drawable 로 전환 할 수 있 습 니 다.

 // ImageView      photo1, 35  30~40  
 iv.setImageLevel(35); 
 // ImageView      photo0, 15 10~20  
 iv.setImageLevel(15);

TransitionDrawable
Layer Deawable 의 하위 클래스 로 Drawable 의 페 이 드 아웃 효 과 를 실현 합 니 다.
예시:
xml 파일 정의

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@mipmap/night" />
 <item android:drawable="@mipmap/photo6" />
</transition>

ImageView 에 src 를 설정 합 니 다.자바 코드 에 있 습 니 다.

 iv= (ImageView) findViewById(R.id.iv_transition);
 drawable = (TransitionDrawable) iv.getDrawable();
 drawable.startTransition(1000); //         
 drawable.reverseTransition(1000);

InsetDrawable
다른 Drawable 을 삽입 하고 주변 에 일정한 간격 을 유지 할 수 있 습 니 다.
예시:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable="@mipmap/photo6"
 android:inset="20dp">
</inset>

ScaleDrawable
레벨 에 따라 Drawable 을 일정 비율 로 크기 조정 합 니 다.level 이 0 일 때 보이 지 않 고 level 이 10000 일 때 크기 조정 효과 가 없습니다.
예시:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable="@mipmap/night"
 android:scaleGravity="center"
 android:scaleHeight="50%"
 android:scaleWidth="50%" />

효 과 를 표시 하려 면 level 이 0 이상 설정 해 야 합 니 다.

 iv = (ImageView) findViewById(R.id.iv_scale);
 ScaleDrawable drawable= (ScaleDrawable) iv.getDrawable();
 drawable.setLevel(1);

-android:scaleHeight="percentage",android:scaleWidth="percentage",너비 와 높이 크기 를 원래 의 비율 로 설정(100%-percentage)
-level 설정 이 클 수록 이미지 표시 가 커 짐
ClipDrawable
자신의 레벨(level)에 따라 다른 Drawable 을 재단 합 니 다.재단 의 방향 은 android:clipOrientation,android:gravity 가 공동으로 결정 합 니 다.level 을 설정 하여 재단 합 니 다.level 의 크기 는 0 에서 10000,level 이 0 일 때 전혀 표시 되 지 않 고 10000 일 때 완전히 표 시 됩 니 다.
xml 정의

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
 android:clipOrientation="horizontal"
 android:drawable="@mipmap/night"
 android:gravity="right"></clip>


 <ImageView
  android:id="@+id/iv_clip"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:src="@drawable/drawable_clip" />

level 설정 으로 재단 하기

 ImageView iv = (ImageView) findViewById(R.id.iv_clip);
 ClipDrawable drawable= (ClipDrawable) iv.getDrawable();
 drawable.setLevel(5000); //    level         
속성
android:clipOrientation,수평 수평 방향 재단,수직 방향 재단
안 드 로 이 드:gravity,재단 방향 에 맞 춰

사용자 정의 Drawable
사용자 정의 원형 Drawable

package com.yu.drawablelearing;

import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;

public class CircleDrawable extends Drawable{

 private int radius;
 private int mWidth;
 private int mHeight;
 private Paint mPaint;
 @Override
 public void draw(Canvas canvas) {
  canvas.drawCircle(mWidth/2,mHeight/2,radius,mPaint);
 }

 public CircleDrawable(Bitmap bitmap) {
  radius = Math.min(bitmap.getWidth(), bitmap.getHeight())/2;
  mWidth = bitmap.getWidth();
  mHeight = bitmap.getHeight();
  BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  mPaint = new Paint();
  mPaint.setShader(bitmapShader);
  mPaint.setAntiAlias(true);

 }
 @Override
 public void setAlpha(int alpha) {
  mPaint.setAlpha(alpha);
  invalidateSelf();
 }

 @Override
 public void setColorFilter(ColorFilter colorFilter) {
  mPaint.setColorFilter(colorFilter);
  invalidateSelf();
 }

 @Override
 public int getOpacity() {
  return PixelFormat.TRANSLUCENT;
 }

 @Override
 public int getIntrinsicHeight() {
  return mHeight;
 }

 @Override
 public int getIntrinsicWidth() {
  return mWidth;
 }
}

원 각 이 있 는 사각형 Drawable 사용자 정의

package com.yu.drawablelearing;

import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;

/**
 * Created by pecu on 2016/08/24.
 */
public class RoundRectangleDrawable extends Drawable {
 private RectF rectF;
 private Paint mPaint;
 Bitmap mBitmap;
 @Override
 public void draw(Canvas canvas) {
  canvas.drawRoundRect(rectF, mBitmap.getWidth()/6,mBitmap.getHeight()/6, mPaint);
 }

 public RoundRectangleDrawable(Bitmap bitmap) {
  mBitmap = bitmap;
  mPaint = new Paint();
  BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  mPaint.setAntiAlias(true);
  mPaint.setShader(bitmapShader);
 }
 @Override
 public void setAlpha(int alpha) {
  mPaint.setAlpha(alpha);
  invalidateSelf();
 }

 @Override
 public void setColorFilter(ColorFilter colorFilter) {
  mPaint.setColorFilter(colorFilter);
  invalidateSelf();

 }

 @Override
 public void setBounds(int left, int top, int right, int bottom) {
  super.setBounds(left, top, right, bottom);
  rectF = new RectF(left, top, right, bottom);
 }

 @Override
 public int getOpacity() {
  return PixelFormat.TRANSLUCENT;
 }

 @Override
 public int getIntrinsicWidth() {
  return mBitmap.getWidth();
 }

 @Override
 public int getIntrinsicHeight() {
  return mBitmap.getHeight();
 }

}

사용자 정의 Drawable 의 일반적인 절차
 1.  사용자 정의 Drawable 클래스 계승
 2.  getOpacity,setColorFilter,setAlpha 등 을 실현 하 는 방법
 3.  onDraw 방법 에서 그리 기
 4.  사용자 정의 Drawable 에 고정된 크기 가 있다 면 getIntrinsic Width,getIntrinsic Height 방법 을 실현 해 야 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기