G Y U L O G

막힌부분

화면을 위와 아래 두 영역으로 나눈다. -> LinearLayout으로 접근했다. 큰 틀을 vertical 로 해두고 안에 레이아웃을 하나씩 넣어 weight 을 1,2,1로 넣어줌. 1:2:1일 건데 버튼 넣을 LinearLayout이 폭이 제일 작음.

 

스크롤뷰 안에 이미지뷰 넣기 -> HoriozntalScrollView를 이용해 가로스크롤도 허용하게 했다. 위 아래 모두 같은 모양으로 구성함. 상단 이미지뷰에만 이미지를 넣고 하단에는 srcCompat 속성을 비워줬다.

 

기능구현은 했는데 이미지 교차시 어떻게 처리해야될 지를 몰라 setVisibility() 메서드를 이용해 처리했다.

 


아래는 내가 구현한 코드이다.

 

public class MainActivity extends AppCompatActivity {
    ScrollView scrollView;
    ScrollView scrollView2;
    ImageView imageView;
    ImageView imageView2;
    BitmapDrawable bitmap;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        scrollView = findViewById(R.id.scrollView);
        scrollView2 = findViewById(R.id.scrollView2);
        imageView = findViewById(R.id.imageView);
        imageView2 = findViewById(R.id.imageView2);

        scrollView.setHorizontalScrollBarEnabled(true);
        scrollView2.setHorizontalScrollBarEnabled(true);

        Resources res = getResources();
        bitmap = (BitmapDrawable)res.getDrawable(R.drawable.dgrw);
        int bitmapWidth = bitmap.getIntrinsicWidth();
        int bitmapHeight = bitmap.getIntrinsicHeight();

        imageView.setImageDrawable(bitmap);
        imageView.getLayoutParams().width = bitmapWidth;
        imageView.getLayoutParams().height = bitmapHeight;

    }

    public void onButton1Clicked(View v){
        imageDown();
    }
    public void onButton2Clicked(View v){
        imageUp();
    }

    private void imageDown(){
        imageView2.setVisibility(View.VISIBLE);
        Resources res = getResources();
        bitmap = (BitmapDrawable)res.getDrawable(R.drawable.dgrw);
        int bitmapWidth = bitmap.getIntrinsicWidth();
        int bitmapHeight = bitmap.getIntrinsicHeight();

        imageView2.setImageDrawable(bitmap);
        imageView2.getLayoutParams().width = bitmapWidth;
        imageView2.getLayoutParams().height = bitmapHeight;
        imageView.setVisibility(View.INVISIBLE);
    }
    private void imageUp(){
        imageView.setVisibility(View.VISIBLE);
        Resources res = getResources();
        bitmap = (BitmapDrawable)res.getDrawable(R.drawable.dgrw);
        int bitmapWidth = bitmap.getIntrinsicWidth();
        int bitmapHeight = bitmap.getIntrinsicHeight();

        imageView.setImageDrawable(bitmap);
        imageView.getLayoutParams().width = bitmapWidth;
        imageView.getLayoutParams().height = bitmapHeight;
        imageView2.setVisibility(View.INVISIBLE);
    }
}

 

중복되는 코드들이 많아 비효율적으로 보인다.

 

Resources res = getResources();
bitmap = (BitmapDrawable)res.getDrawable(R.drawable.dgrw);
int bitmapWidth = bitmap.getIntrinsicWidth();
int bitmapHeight = bitmap.getIntrinsicHeight();

이 코드블럭을 여러번 쓰기위해서 전역설정했더니 onCreate안에서 돌아야하는 건지 오류가 나오면서 진행되지않았다.


개선하고 싶은 것들

setVisibility()를 활용한게 아니라 다른 방법으로 이미지를 교체하고 싶다. 지금 구현한건 이미지 띄워놓고 켰다가 끄기 밖에 안된다.

 

모듈화를 시키고 싶다. 반복되는 코드가 많아 지저분해보인다.

 


개선 방법

내가 정답 코드를 올리면 책 저자에게 허락을 맡은 게 아니라서 정당화될 수 없다고 생각한다. 정답코드를 보고 어떻게 고쳐야하는지에 대해서만 작성하겠다.

 

button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                moveImageDown();
            }
        });

함수를 따로 작성하지않고 이미 있는 메서드를 이용해 코드 라인수를 줄이는 방법이다. setOnClickListener를 이용해 onClick시에 어떤 행동을 할 건지 지정해준다.

 

imageView.setImageResource(0);

setImageResource()를 이용해 이미지를 간단하게 가져온다. 파라미터는 R.drawble.*이다.

 

파라미터를 0으로 주면 이미지가 사라진다. null과 같은 효과로 생각된다.

 

imageView.invalidate();

invalidate()메서드는 공식문서에서 아래와 같이 서술 되어있다.

/**
     * Invalidate the whole view. If the view is visible,
     * {@link #onDraw(android.graphics.Canvas)} will be called at some point in
     * the future.
     * <p>
     * This must be called from a UI thread. To call from a non-UI thread, call
     * {@link #postInvalidate()}.
     */

전체 뷰를 무효화한다 -> 갱신한다는 의미가 되겠다. 객체지향언어인 Java이므로 메서드 끝에 invalidate메서드를 껴주면 뷰가 갱신되며 원하던 출력이 화면에 나오는 효과를 볼 수 있다.

 

원래 사진 존재 -> 지우기 -> 사진 꺼내기 의 프로세스가

원래 사진 존재 -> 지우기 -> 갱신 후 사진꺼내기 로 변하는 것 같다.

 

저자는 스크롤뷰는 자바파일에서 안건드리고 xml에서만 건드렸다. 나도 지금 생각하면 할 필요가 없었던것 같다.

 

"댓글, 공감 버튼 한 번씩 누르고 가주시면 큰 힘이 됩니다"

공유하기

facebook twitter kakaoTalk kakaostory naver band