스마트기기개발관련/안드로이드 개발

안드로이드 이미지 리소스 관련~

AlrepondTech 2020. 9. 18. 19:47
반응형

 

 

=================================

=================================

=================================

 

 

 

//출처 : http://skyunoe.blog.me/20113536662

 

안드로이드는 외부 리소스를 R.java 클래스로 관리 합니다.

R.java 클래스는 /res 디렉토리 하위에 등록하고 정의한 모든 자원들에 대한 명세서로, 자원들이 프로젝트에 추가될 때 마다 개발 프로그램이 자동 생성합니다.

 

아래는 이클립스에서 안드로이드 프로젝트를 생성했을때 디렉토리 구조로, R.java 파일의 위치와 /res 디렉토리의 구조를 간단하게 볼 수 있네요.

 

     

 

 

리소스를 추가하거나 XML파일을 만들때, 생성되는 파일 및 디렉토리의 이름은 자유지만, 관리상 편의를 위해 보통 아래와 같이 구성해 줍니다. 

  • /res/drawable : jpg나 png등의 이미지 파일
  • /res/layout : Activity의 레이아웃을 정의하는 XML 파일
  • /res/values : 데이터를 표현하는 XML 파일 

- arrays.xml (데이터 배열)

- colors.xml (생상)

- demens.xml (크기)

- strings.xml (문자열)

- styles.xml (스타일)

  • /res/xml : 임의의 XML파일
  • /res/raw : 디바이스를 직접 복사하는 임의 파일
     

아래는 R.java클래스의 내용입니다.

/res 디렉토리에 등록된 모든 리소스들은 R.java클래스의 내부 클래스(inner class)형태로 등록되며, R.java 클래스는 각 자원에 대한 식별 아이디를 가짐으로서 프로그램이 각 자원에 접근할 수 있도록 해줍니다. 쉽게 말해, 아이콘 파일을 이용하기 위해서는 R.drawable.icon으로 이용하면 되고, main.xml에 정의된 레이아웃을 이용하기 위해 R.layout.main으로 접근하면 된다는 의미가 됩니다.

 

 

 

 

=================================

=================================

=================================

 

 


출처: http://han1000jae.blog.me/80109106175

숫자 이미지를 한번에 관리하고 블록 차례대로 한번에 출력하기 위하여 Drawble객체를

 

배열로 만들었다.

 

개인 프로젝트를 했을 때는 다음과 같이 Drawable 객체 배열을 생성하여 리소스 등록을 하였다.

 

 

이번 팀프로젝트에서 3개의 이미지와 3종류의 크기가 있어서

 

이런식으로 하다간 코드가 걸레가 될것 같아서 머리를 굴려봤다.

 

for문을 써 볼수 없을까...

 

안드로이드는 리소스를 R class에 int형 상수로 리소스를 자동으로 등록이 되도록 하고있다.

 

이 R class는 static이라서 객체 생성없이 바로 클래스 이름으로 쓸 수 있는데..

 

 

R class는 위와 같이 리소스를 종류별로 분류를 하여 상수형태로 관리를 하게 해준다.

 

상수로 선언이 되어있어 값의 변경은 불가능 하지만 다음과 같이 하면 for문을 써서 깔끔하게

 

정리 할수 있다.

 

 

이렇게 해두면 img에 대입하는 리소스 값을 상황에 따라 바꿔주고 값만 잘 조절해주면

 

어떤 종류, 어떤 크기일지라도 값만 잘 조절해주면 손쉽게 관리할 수 있고 코드도 한결 깔끔해 진다.

 

위의 경우는 리소스가 출력하고자 하는 순서대로 등록이 되어있을 때만 가능한 일이다.

 

만약 리소스가 출력하고자 하는 순서대로 등록이 되어있지 않을 때는 1차원 배열을 사용하여

 

간단히 해결하면 블록이 추가되더라도 resource_seq에 리소스만 추가 해주면 코드를 수정할 필요도

 

없다.

 

 

 

android:layout_width="fill_parent"
android:layout_height="fill_parent"
 <--이걸로 하시면 배경에 꽉차게 됩니다.

 



=================================

=================================

=================================

 

 

 

반응형

 

728x90

 

 

 

안드로이드에서 drawble은 어플리케이션을 쉽게 작성하는데 매우 유용하다. Drawable 은 View와 매우 연관성이 높은 플러그인 가능한 드로잉 컨테이너이다. 예를 들어 BitmapDrawable 은 이미지를 디스플레이하기 위해 사용되고 ShapeDrawable은 도형과 gradient를 그리기 위해 사용된다. 개발자는 복잡한 렌더링을 작성하기 위해 이것들을 조합할수 있다.

 

Drawable은 widget을 상속 받지 않고 렌더링을 쉽게 커스터마이징 할수 있도록 해준다. 사실, Drawable은 매우 편리해 안드로이드의 기본 어플리케이션과 widget의 대부분이 사용한다. 핵심 안드로이드 프레임워크에서 사용되는 drawable은 700개 정도나 된다. drawable은 시스템을 통해 매우 극단적으로 사용되기 때문에 안드로이드는 리소스가 로딩되는 과정을 최적화 하고 있다. 예를 들어, 매번 버턴을 만들때 마다 새로운 drawable이 프레임워크 리소스(android.R.drawable.btn_default)로 부터 로딩 되는데 이는 모든 어플리케이션의 모든 버튼이 버튼의 배경으로 다른 drawable 인스턴스를 사용한다는 것을 의미한다. 하지만 이 모든 drawable "상수 상태(constant state)"(역자 주 : 절대 변경 블가한 상태값)라고 불리는 공통의 상태를 공유 한다. 이 상태의 내용은 사용하는 drawable의 유형에 달려 있으나 보통  리소스에 의해 정의될수 있는 모든 속성들을 포함한다. 버튼의 경우 상수 상태는 bitmap 이미지를 포함한다. 이때 모든 어플리케이션의 모든 버튼은 많은 메모리를 절약하기 위해 동일한 bitmap을 공유하게 된다.

아래의 다이어그램은 다른 두 view의 배경으로 동일한 이미지 리소스를 사용할 경우 생성되는 개체들을 보여준다.

 

 

이 상태 공유 기능은 많은 메모리 낭비를 훌륭하게 방지할 수 있지만 drawable의 속성을 변경할려고 할때 문제를 발생시킬수 있다. 도서 목록을 가지는 어플리케이션을 상상해보자. 각 도서는 도서명과 별표를 가지며 사용자가 즐겨찾기 도서로 표시할 경우 전체적으로 불투명할수 있고 즐겨찾는 책이 아닐 경우 반투명할 수도 있다. 이런 효과를 구현하기 위해 사용하는 리스트 어댑터의 getView() 메서드(역자 주 : 커스텀 어댑터 작성시 구현해야할 메서드)에서 아래와 같은 코드를 작성해야할 것이다.

 

Book book = ...;
TextView listItem = ...;

listItem.setText(book.getTitle());

Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
star.setAlpha(255); // 불투명
} else {
star.setAlpha(70); // 반투명
}

 

불행하게도 위 코드는 모든 drawable이 같은 투명도를 갖는 엉뚱한 결과를 보여준다.

 

이 결과는 상수 상태에 대해 설명해주고 있다. 각 아이템별로 별도의 drawable 인스턴스를 갖더라도 같은 상수 상태값을 갖는다. BitmapDrawable의 경우 투명도는 상수 상태값의 한 부분이다. 따라서 drawable 인스턴스중 하나의 투명도 변경은 다른 모든 인스턴스의 투명도를 변경 시킨다. 더 심각한 것은 안드로이드 1.0 과 1.1에서는 이런 이슈를 회피하기가 쉽지 않다는 것이다. (역자 주 : 허걱!.. 그러나 국내 출시된 안드로이드 폰중에 1.0과 1.1은 없다. ㅋㅋ)

안드로이드 1.5 이상에서는 mutate() 메서드를 통해 이 문제를 매우 쉽게 해결할 수 있다. drawable의 이 메서드를 호출할 때 다른 drawable에 영향을 주지 않고 특정 속성이 변경될수 있도록 drawable의 상수 상태를 복사한다. drawable이 mutate된 후에도 bitmap은 여전히 공유된을 주목하라. 아래 다이어그램은 drawable의 mutate()메서드를 호출했을때 무슨일이 일어나는지를 보여준다.

 

mutate()를 사용하여 이전 코드를 수정해보자.

 

Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
star.mutate().setAlpha(255); // 불투명
} else {
star. mutate().setAlpha(70); // 반투명
}

 

연속된 메서드 호출이 가능하도록 하기 위해 mutate()메서드를 drawable 자신을 리턴한다. 하지만 새로운 drawable 인스턴스를 만들어내지는 않는다. 새로운 코드로 어플리케이션을 실행하면 올바르게 동작하는 것을 볼수 있다.



 

=================================

=================================

=================================

 

 


출처: http://sdw8001.tistory.com/entry/Android-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EA%B0%9C%EB%85%90-CanvasBitmapDrawable


1. 기본적으로 resource에 저장되어 있는 이미지의 경우 Drawable이라는 오브젝트를 구해와서 화면에 그릴 수가 있습니다.

 

Drawable drawable = getResources().getDrawable(id);

drawable.setBounds(0,0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  // drawable을 어느 영역에 그릴 것인가?

 

onDraw(canvas canvas) {

           drawable.draw(canvas);

}

 

setBounds에 설정한 값에 따라서 자동으로 이미지가 scaling이 됩니다.

 

원본 이미지 사이즈가 100*50인데 bounds를  (0,0, 200, 100)이라고 설정하면 가로 세로가 2배로 확대되어서 그려지겠죠.

 

2. 임의의 bitmap을 생성하고 bitmap에 원하는 내용그리기

 

다음과 같이 임의의 bitmap을 생성합니다.

Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);

 

Config.ARGB_8888말고 Config.RGB_565 있고 몇가지 있습니다.

 

원하는 걸로 생성하면 되는데 ARGB8888 생성할 경우 투명값을 지정할 수가 있는 반면 RGB_565 생성하시면 불투명한 이미지만 가능합니다.

 

이렇게 만들어진 bitmap에 직접 그림을 그리거나 다른 이미지를 그릴려고 하면 아래와 같이 새로운 canvas를 만들어야 합니다.

 

Canvas canvas = new Canvas();

canvas.setBitmap(bitmap);

 

그러면 향후에 canvas에 그리는 모든 작업은 bitmap에 반영이 됩니다.

 

3. Bitmap Drawable간의 변환

 

안드로이드에서는 bitmap을 직접 다루기보단 대부분 Drawable이라는 wrapping된 형태로 이미지를 처리하기 때문에

 

Bitmap의 경우 종종 Drawable로 변환해야 하는 경우가 있습니다.

 

이를 위해서 BitmapDrawable이라는 클래스가 존재하고 아래와 같은 식으로 사용이 가능합니다.

 

Drawable drawable = (Drawable)(new BitmapDrawable(bitmap));

 

BitmapDrawable은 Drawable로 캐스팅이 가능하죠.

 

4. canvas 처리

 

w*h크기의 drawable 오브젝트가 있을 때 setBounds를 이용하여 임의의 좌표(x,y)에 원형크기대로 출력할려면 아래와 같습니다.

 

obj.setBounds(x,y,x+w,y+h);

obj.draw(canvas);

 

이 방식의 귀찮은 점은 항상 w,h를 지정을 해줘야 하기 때문에 코드도 상당히 길어지고 지저분해보이는 경우가 많습니다.

(getIntrinsicWidth()/Height()로 항상 구하던지 별도의 변수에 값을 유지해야하죠)

 

그래서 위와 같은 방법보다는 아래와 같이 canvas의 좌표이동 변환식을 이용하는게 깔끔합니다.

 

obj.setBounds(0,0,w,h); // 얘는 drawable을 최초로 생성했을 때 한번만 지정하면 됨

 

canvas.save(); // 현재 변환식을 저장

canvas.translate(x,y) // 좌표이동과 관련된 변환식 적용

obj.draw(canvas); // drawable을 그린다.

canvas.restore(); // 원래 변환식으로 복구

 

canvas.translate(x,y) 를 지정할 경우 출력할 이미지를 (x,y)만큼 이동시켜서 그려줍니다. (좌표이동 행렬식이라고 생각하면 됨)



 

=================================

=================================

=================================

 

 


출처: http://www.androidpub.com/814364

 

리소스를 보기 좋게 정렬하려고 하는데요
drawable 속에 bubble 이라는 폴더를 넣으려고 하는데요 
drawable 속에 폴더를 만들고 그안에 이미지 파일을 넣으면

R.java 에서 폴더속에 파일들을 인식하지 못하더라구요... 이거 폴더속에 하나하나 저장해야지 이미지가 안섞이고 관리가
편리 할것 같은데.. 해결 방법이 없나요???

drawable 에서 모든 리소스를 관리하기엔.. 너무 복잡하자나영 ㅠ

이 게시물을...

목록

엮인글 주소 : http://www.androidpub.com/814364/166/trackback

 

2010.09.25 16:51:25

꿀통이

검색해서 보니 불가능인가요??

 

2010.09.26 22:45:11

라이더훈

불가능입니다. 안드로이드 도서에 나와있네요..



 

=================================

=================================

=================================

 

 

 

출처: http://croute.me/399

[Android] Image Resource 불러오기 (Drawable Resource)
 

안드로이드에서 프로그래밍을 할때는 이미지 리소스를 많이 사용합니다.
보통 우리가 사용하는 방법은, drawable 폴더에 리소스를 넣어놓고, R.drawable.파일이름 으로 불러오는 것입니다. 

하지만, 항상 이렇게 사용하지는 않습니다. 직접 파일이름을 이용해서 불러오는 방법을 사용하기도 합니다. 

public abstract Resources getResources ()

Since: API Level 1

Return a Resources instance for your application's package.


 

int imageResource = context.getResources().getIdentifier("파일이름", "drawable", context.getPackageName());



직접 파일이름을 입력해서 리소스를 불러올때는
getResource() 라는 메소드를 사용합니다. 

그리고 어떤 리소스인지를 식별하기 위해서
getIdentifier() 라는 메소드를 사용하는데 이 메소드에는 순서대로, 파일이름 리소스타입 패키지네임 입니다.

이렇게 해서 불러오면 R.drawable.파일이름 으로 접근한것과 같은 리소스를 가질 수 있습니다.

 

 

=================================

=================================

=================================

 

 

반응형