본문 바로가기
일상생활 이야기/안드로이드 스튜디오 독학하기

안드로이드 스튜디오 독학하기 28일째

by 인터넷떠돌이 2017. 3. 26.
반응형

안녕하세요? 


이번 포스팅에서는 스크롤뷰라고 해서 화면에 한번에 안 들어오는 이미지를 보기 위해서 스크롤을 추가해서 이를 활용하는 방법에 대해서 포스팅을 하고자 합니다. 우선 새 프로젝트를 생성하면서 그 이름을 SamplescrollView라고 지정을 합니다. 다음으로는 하드디스크에 있는 그림파일-제 경우에는 jpg파일을 ctrl+c를 눌러서 복사를 하고, 안드로이드 스튜디오 상에서 drawable이라는 폴더 안에다가 ctrl+v를 눌러서 붙여넣기를 해 줍니다.



위 스크린샷에서 보이는 것처럼 drawable폴더 안에다가 이미지파일을 두개 집어넣고 나서는 다음은 activity_main.xml로 가서, 제약 레이아웃으로 된 것을 리니어 레이아웃으로 바꾸어 주도록 합니다.



위 스크린샷은 activity_main.xml을 리니어 레이아웃으로 바꾸고 난 다음의 화면입니다. 이렇게 리니어 레이아웃으로 activity_main.xml을 바꾼 다음에는 먼저 버튼을 하나 추가시키도록 합니다.



버튼의 ID를 btn1으로 지정을 하도록 하고, 이후 MainActivity.java에서 코딩할 수 있도록 onClick속성에다가 btn1click이라고 지정을 또한 하도록 했습니다.



먼저 HorizontalScrollView라고 하는 것을 버튼아래에 추가를 해야 하는데, 일단 팔레트 윈도우 내에서 Containers항목에 있는 것을 볼 수 있었습니다.



팔레트에 있는 HorizontalScrollView를 버튼아래에 그냥 추가하기가 어려워서, 하는 수 없이 붉은색으로 표시가 된 component tree안에다가 추가를 해야만 해야 했습니다. 다음으로는 ScrollView라는 것을 추가해야 하는데, 이 역시 한번에 제대로 되지 않고 에러가 떠서, 먼저 HorizontalScrollView에 있는  LinearLayout을 삭제하고 난 다음에 Component Tree에 추가를 해야만 위 그림과 같이 될 수 있었습니다.



다음으로는 ImageView라는 컴포넌트를 ScrollView아래에 추가해야 했는데, 그냥 추가할 경우 역시 에러가 발생하는 문제점이 있었습니다. 그래서 ScrollView아래에 있는 LinearLayout을 제거하고 난 다음에 추가를 해야만 했습니다. 다음으로는 반드시 이미지를 지정해야만 하는 문제점이 있었습니다만, 이 옆에 있는 properties윈도우에서 빨간색으로 밑 줄을 친 부분처럼 지워서 비워두고, Layout_width와 height는 wrap_content라고 표시를 하였습니다.



다음으로는 MainActivity.java에서 코딩을 하는 모습입니다. 우선 제일 먼저 보일 구문은 스크롤뷰를 사용가능하도록 하는 구문입니다.


ScrollView 변수이름 = (ScrollView)findById(R.id.스크롤뷰의 ID);

변수이름.setHorizontalFadingEdgeEnabled(true)


이런 식으로 해서 스크롤뷰에서 수평스크롤바를 사용가능하게 하는 구문인데, 여기서 주의할 것은 HorizontalScrollView의 ID를 입력하면 에러가 뜬다는 것입니다. 이 경우에는 수평으로 움직이는 것을 허용하는 것인데, 이미 수평으로 움직일 수 있는 HorizontalScrollView를 지정하면 안되고, 이것이 불가능한 ScrollView의 ID를 지정해야만 했습니다. 일단 제가 이해한 것은 여기까지이긴 합니다.


다음으로는 ImageView에서 어떤 이미지를 띄울 것이냐를 지정하는 코딩을 하는 것입니다.


ImageView 변수이름 = (ImageView)findViewById(R.id.이미지뷰의 ID);

Resources res = getResources();


이런 식으로 변수이름은 다음과 같은 ID를 가지는 이미지류이며, 리소스를 가져와라 하는 명령이 됩니다.


BitmapDrawable 변수이름2 = (BitmapDrawable)res.getDrawable(R.drawable.그림파일 이름);

int 변수이름3 = 변수이름2.getIntrinsicWidth();

int 변수이름4 = 변수이름2.getIntrinsicHeight();

변수이름.setImageDrawable(변수이름2);

변수이름.getLayoutParams().width = 변수이름3

변수이름.getLayoutParams().height = 변수이름4;


이 구문은 무엇을 의미하느냐 하면, 제일 윗줄에서는 그림파일 이름을 변수이름2에 집어넣어서 그림파일 이름이 같은 drawable폴더 안의 그림파일을 지정한다라는 의미입니다. 그리고 이어지는 다음 구문


int 변수이름3 변수이름2.getIntrinsicWidth();

int 변수이름4 = 변수이름2.getIntrinsicHeight();


이건 각각 그림파일이 변수이름2에 들어갔으니, 이제 이 변수이름2에서 그림의 원래 넓이와 높이를 구하라는 의미가 됩니다. 다음으로 이어지는 구문


변수이름.setImageDrawable(변수이름2);


이미지뷰 안에 들어가는 이미지를 지정한다는 의미가 됩니다. 당연 변수이름2가 들어가 있으니, 그림파일 이름.jpg가 이미지뷰 안에 들어가게 됩니다.


변수이름.getLayoutParams().width = 변수이름3

변수이름.getLayoutParams().height = 변수이름4;


이 구문은 의미하는 바가 바로 이미지뷰의 넓이와 높이는 그림파일의 원래 넓이와 길이에 맞도록 갖추어 주라는 의미가 됩니다. 이런 식으로 코딩을 한 다음에는 이어지는 버튼은 다음과 같이 코딩을 해 줍니다.


여기서 public void btn1click(View) { 안에 있는 changeImage();는 원래 안드로이드 스튜디오에서 원래 지정되어 있지 않은 메서드 입니다. 그렇기 때문에 이어지는 아래의 메서드에서 머튼을 누를 경우 이미지가 바뀐다는 것을 지정해야 합니다. 그런데 이러한 노력에도 불구하고 크나큰 문제가 발생하였습니다.



아무리 해도 이미지가 전혀 보이지 않았는데, 문제가 API23에서는 getDrawable()메서드가 더 이상 유용하지 않다고 합니다. 그래서 이를 보강하기 위해서는 해결책을 찾아야 하는데, 이 포스팅이 늦춰질 정도로 찾아보았습니다만 아직도 찼지 못했습니다. 아무튼 다음 포스팅에서는 이 해결책을 찾아서 포스팅 할 것을 약속드립니다.



반응형