본문 바로가기

프로그래밍/안드로이드

[안드로이드] 스크롤뷰(ScrollView)












public class ExerciseExam extends AppCompatActivity {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_excercise_exam);

ScrollView svw = (ScrollView)findViewById(R.id.scr);

//svw.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET); // 스크롤 바 스타일
//svw.setVerticalFadingEdgeEnabled(false);
//svw.setVerticalScrollBarEnabled(false);

svw.addView(new ColorView(this)); // ColorView 객체생성 후 스크롤뷰의 차일드로 추가
}
}

class ColorView extends View {
public ColorView(Context context){
super(context);
}

public void onDraw(Canvas canvas){ // 캔버스는 뷰의 그리기 표면이며 이 위에 그림을 그린다.
Paint Pnt = new Paint();                        // Paint 객체 생성
for(int y=0; y<2560; y+=10){
Pnt.setARGB(255, 255-y/10, 255-y/10, 255); // 색상 정하기
canvas.drawRect(0, y, 2560, y+10, Pnt); // 직사각형 그리기
}
}

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){
setMeasuredDimension(2560, 2560); // 뷰의 크기를 폭 2560, 높이 2560으로 강제로 지정
}
}


복습하기


그리기를 할 떄는 뷰 위에다가 바로 그릴 수 없다.

뷰 위에다가 종이를 깔아야 된다. 이 종이 역할을 하는 것이 "Canvas"이다.

캔버스에는 다양한 그리기 메서드가 제공된다.


canvas하고 점을 찍으면 다양한 메서드들이 나온다.

위 예제에서는 drawRect이라는 메서드를 호출했다.

Rect은 Rectangular의 줄임말이며 4개의 인수가 존재한다. (몇 가지 오버로드 되어있지만 예제만 보자.)


void drawRect (float left, float top, float right, float bottom, Paint paint)

canvas.drawRect(0, y, 2560, y+10, Pnt);

도형을 세밀하게 그릴 수 있으려면 left, right, top, bottom 값은 실수로 전달할 수 있어야 한다.

따라서 형타입으로 float를 갖는다.


인자 순서대로 보면 left~right 까지의 거리는 2560 (즉 가로화면을 2560만큼 채운다.)

 top~bottom은 for문에 의해 0~10 / 10~20 / 20~30 / ... / 2550~2560 을 갖는다











위 그림에는 높이 10, 가로를 가득채우는 직사각형이 수 십 개 존재하게 된다.

setARGB도 for문의 영향을 받아 점점 진해지게 하는 역할을 한다.


ScrollView svw = (ScrollView)findViewById(R.id.scr);
1 // svw.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_INSET);
2 // svw.setVerticalFadingEdgeEnabled(false);
3 // svw.setVerticalScrollBarEnabled(false);


주석처리된 부분도 설명이 필요할 것이다.


1. setScrollBarStyle (int style)

SCROLLBARS_INSIDE_OVERLAY

SCROLLBARS_INSIDE_INSER

SCROLLBARS_OUTSIDE_OVERLAY

SCROLLBARS_OUTSIDE_INSER


INSIDE와 OUTSIDE의 차이는 스크롤 바를 패딩에 놓을 것인지, 가장자리에 놓을 것인가의 차이다.


INSET과 OVERLAY의 차이는 자리를 차지할 것인지, 배경위에 얹힐 것인지를 지정한다.

(INSET인 경우, 스크롤바 영역에는 생삭이 채색되지 않는다.)


디폴트 값인 INSIDE_OVERLAY만 살표보도록 하겠다.