Android/View | Posted by 덩치 2014. 4. 24. 16:18

TextView에 marquee 적용하기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


Marquee란, 전광판같은곳에서 문장을 좁은 공간에 표시하기위해


옆으로 이동하면서 숨겨진부분의 글자들이 표시되도록 하는것이다.


앞의 글자가 왼쪽으로 사라지고 뒤에 글자가 나타나는형식


Xml 레이아웃에서 텍스트뷰 속성에


        android:ellipsize="marquee"

        android:focusable="true"

        android:marqueeRepeatLimit="marquee_forever"

        android:singleLine="true"


를 추가 해 주면 된다.


첫번째는 marquee를 사용하겠다는 뜻이고,

두번째는 focusTextView가 가지고 있어야 하기때문에 설정한다.

세번째는 반복횟수인데, int값을 줘도 되고 저렇게 계~속 움직이도록 할 수 있다.

네번째는 텍스트뷰의 라인을 한줄로 표시하는것으로, 텍스트가 영역을 벗어날정도로 긴 경우에도

줄내림을 하지 않는다는것이다. 그래야 marquee가 적용된다.



아주 중요한것. 오늘 이것때문에 하루종일 씨름했는데,

setText 할 때 마다 marquee초기화되어 처음부터 표시되기에 setText가 자주 발생하는 뷰에 적용하기에는


성격이 맞지 않다.



펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

이 글에서는 

터치이벤트(TouchEvent)로 비트맵이미지 이동시키기

에서 발전하여 특정 영역 밖으로 이미지가 이동하지 않도록 하는 방법을 알아보겠다. 아주 간단하다.


화면 영역 밖으로 나가지 않게 하려면 단말기의 Height와 Width를 받아오면 되고, 특정 수치를 부여하려면

이런 과정이 필요없다.

Display dis = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

int width = dis.getWidth();

int height = dis.getHeighy();


그리고 다음과 같은 조건을 준다.

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

//디스플레이 영역 설정. 이미지X,Y는 이미지의 X좌표,Y좌표를 뜻함

if (이미지X >= 0 && 이미지X <= width && 이미지Y >= 0 && 이미지Y <= height) {

//그리기 실행

}

//여기

   }

}

이상태로 끝내버리면 위 조건이 false, 즉 화면영역 밖으로 좌표가 튀어나갔을경우 그리기가 멈춰버린다. 이미 값이

튀어 나갔기때문에 true가 들어오지 않는다. 그러므로

//여기 위치에서 이미지를 영역 안으로 새로고침해준다.

if (이미지X < 0) {

이미지X = 0;

}

if (이미지X > width) {

이미지X = width

}

if (이미지Y < 0) {

이미지Y = 0;

}

if (이미지Y > height) {

이미지Y = height

}


이렇게 해주면 이미지가 조건을 벗어나게 되더라도 새로고침하여 그 다음 입력이 true가 되므로,

실행을 이어서 할 수 있다.


단말 전체가아니라 특정 영역에서만 움직이게 하고싶다면 width,height는 상황에 맞게 조절하면 된다.


문의점은 댓글로 !

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

요점은 ACTION_DOWN 이벤트 발생 시, 해당 좌표값 저장, 이후 MOVE 발생 시

다른 변수에 해당 값 저장. 둘의 값 비교 == 이동량

이미지를 기존 이미지 위치 - 이동량 하여 새로그려줌

그리고 처음 DOWN때 위치를 저장한 변수에 두번째 값을 넘겨주고

다시 MOVE 이벤트 발생시 값 갱신 하는식으로

MOVE시마다 이전값과 이후값의 차가 이동한 거리이므로 계속 새려그려주면 손가락을 따라 움직이는것처럼 표현된다.


float saveX, saveY;

float moveX, moveY;

float diffX, diffY;

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

saveX = event.getX();

saveY = event.getY();

}

if (event.getAction() == MotionEvent.ACTION_MOVE) {

moveX = event.getX();

moveY = event.getY();

diffX = saveX - moveX;

diffY = saveY - moveY;

// SurfaceViewView에 따라 그리는 방식은 달라짐. SurfaceView같은경우

canvas.canvas = mHolder.lockCanvas();

canvas.drawBitmap(img, 기존이미지X - diffX, 기존이미지Y - diffY, p);

holder.unlockCanvasAndPost(canvas);

//뷰같은경우 locakCanvas(); 대신 invalidate();로 재호출.

saveX = moveX;

saveY = moveY;

}

}


그리기 부분은 따로 설명하지 않았다. 새로운 포스트로 소개할듯 싶지만,

그 전에 궁금한부분이 있으면 댓글주기바람