view의 상호작용

** UI 그리기는 사용자 정의 뷰 작성의 일부일 뿐입니다.이외에 당신은 사용자의 입력에 매우 가까운 방식으로 응답해야 한다.모든 대상은 현실 세계의 대상처럼 표현해야 한다.예를 들어 그림이 갑자기 사라진 후에 다른 곳에 나타나서는 안 된다. 왜냐하면 현실 속의 물체는 그렇지 않기 때문이다.도리에 맞는 방법은 그것이 한 위치에서 다른 위치로 옮겨야 한다는 것이다.사용자는 UI의 정교한 조작을 체험하거나 인터페이스만 느낄 수 있다. 비교해 보면 전자가 모의한 현실 세계에서 가장 좋은 사용자 체험을 얻을 수 있다.예를 들어 사용자가 UI를 조작할 때 인터페이스의 슬라이딩 응답 지연을 느끼면 짜증나고 미친 슬라이딩 화면을 느낄 수 있다.
이 글은 안드로이드 프레임워크의 특징을 결합시켜 현실 세계의 행동을 맞춤형 보기에 추가하는 방법을 보여 준다.
제스처 입력 처리
다른 많은 UI 프레임워크와 마찬가지로 Android는 입력 이벤트 모델도 지원합니다.사용자의 동작은 리셋 함수를 터치하는 이벤트로 바뀔 것입니다. 이 리셋 함수를 다시 써서 응용 프로그램이 사용자에게 어떻게 응답하는지 설정할 수 있습니다.Android 시스템에서 가장 자주 사용하는 입력 이벤트는 터치 이벤트입니다. 터치 이벤트(android.view.Motion Event) 를 터치합니다. 이 방법을 다시 쓰면 이벤트를 처리할 수 있습니다: **
@Override   
public boolean onTouchEvent(MotionEvent event) {    
return super.onTouchEvent(event);  
}

사건을 만지는 것 자체가 특별히 유용한 것은 아니다.현재 터치 가능한 UI는 두드리기, 당기기, 밀기, 흔들기, 축소 등 다양한 제스처 동작의 상호작용을 받아들일 수 있다.안드로이드 시스템은 Gesture Detector 종류를 제공하여 기본적인 터치 이벤트를 다양한 제스처로 전환시킨다.GestureDetector.Gesture Listener 인터페이스는 Gesture Detector의 실례를 구성합니다.만약 당신이 단지 일부분의 제스처 동작을 처리하고 싶을 뿐이라면, Gesture Detector를 계승하는 것을 선택할 수 있습니다.Simple On Gesture Listener는 Gesture Detector를 실현할 필요가 없습니다.OnGestureListener 인터페이스.예를 들어 다음 코드는 Gesture Detector를 계승하는 것을 만들었습니다.Simple On Gesture Listener의 클래스와 On Down 방법을 다시 썼습니다.
class mListener extends GestureDetector.SimpleOnGestureListener {   
@Override   
public boolean onDown(MotionEvent e) {       
     return true;   
}
}
mDetector = new GestureDetector(PieChart.this.getContext(),new mListener());

Gesture Detector를 사용했든 안 사용했든 상관없습니다.Simple On Gesture Listener 클래스, onDown () 방법을 실현하고true로 돌아가야 합니다.이 단계는 반드시 필요합니다. 모든 터치 동작은 onDown () 방법의 이벤트에서 시작되기 때문입니다.Gesture Detector처럼 onDown () 방법에서false를 되돌려줍니다.Simple On Gesture Listener가 디자인한 것처럼 시스템은 당신이 다른 제스처를 필요로 하지 않는다고 생각할 것입니다. 그러면 Gesture Detector.OnGestureListener 인터페이스의 나머지 방법은 모두 호출되지 않습니다.온다운 () 방법을false로 되돌릴 수 있는 유일한 방법은 모든 제스처를 무시하고 싶다는 것이다.Gesture Detector를 실현하면Gesture Listener 인터페이스와 Gesture Detector 클래스의 실례를 만들었습니다. Gesture Detector 클래스로 온터치 이벤트 () 방법에서 받은 터치 이벤트를 완성할 수 있습니다.
@Override
public boolean onTouchEvent(MotionEvent event) {   
boolean result = mDetector.onTouchEvent(event);   
if (!result) {       
if(event.getAction()==MotionEvent.ACTION_UP){           
stopScrolling();           
result = true;       
}   
}   
    return result;
}

온터치 이벤트 () 방법의 터치 이벤트를 실행하고 제스처의 일부분으로 생각하지 않으려면false로 돌아가야 합니다.사용자 정의 검사 제스처 동작을 실행할 수 있는 코드를 실행할 수 있습니다.
보다 직관적인 제스처 입력
제스처는 터치스크린 장치를 제어하는 강력한 방법이지만, 합리적인 결과를 얻지 않으면 직감에 어긋나 기억하기 어렵다.손가락을 미끄러뜨리는 것은 사용자가 손가락 하나로 화면에서 빠르게 미끄러져 올리는 좋은 예이다.UI의 응답 속도가 사용자의 빠른 슬라이딩 화면 주파수를 따라잡을 때만 이 제스처 동작은 사용자가 비행기 바퀴를 움직여 회전시키려는 것처럼 의미가 있다.
그러나 비행선을 모의하는 느낌도 평범하지 않다.정확한 비행기 운행 모형을 얻으려면 대량의 물리와 수학 검증이 필요하다.다행히도, 안드로이드는 도움말 종류를 제공하여 그것과 다른 조작 행위를 시뮬레이션했다.Scroller 클래스는 플라이휠 스타일의 제스처 작업을 처리하는 기본 클래스입니다.슬라이딩 작업을 시작할 때 fling()을 호출하여 초기 속도와 X축과 Y축에서 슬라이딩하는 최소값과 최대값을 전달해야 합니다.이 속도의 값에 따라 GestureDetector 클래스를 통해 계산할 수 있습니다.
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   
mScroller.fling(currentX, currentY, velocityX / SCALE, velocityY / SCALE, minX, minY, maxX, maxY);   
postInvalidate();
}

힌트:GestureDetector 클래스를 통해 계산된 속도는 이론적으로 정확하지만 많은 개발자들은 이 값으로 미끄러지는 애니메이션을 너무 빨리 만들 수 있다고 느낀다.흔히 사용하는 방법은 X와 Y 방향의 속도를 4에서 8 사이의 어떤 값으로 나누는 것이다.
fling () 방법을 호출하면 미끄럼 조작의 물리적 모형을 만들 수 있습니다.다음에, 당신은 적시에 Scroller를 호출해야 합니다.컴퓨터ScrollOffset () 방법으로 Scroller 클래스의 데이터를 업데이트합니다.컴퓨터Scroll Offset () 방법은 현재 시간을 읽고 물리 모델로 현재 X 좌표와 Y 좌표를 계산해서 Scroller 대상의 내부 상태를 업데이트합니다. getcurrX () 와 getcurry () 방법을 사용하면 최신 X 좌표와 Y 좌표를 얻을 수 있습니다.대부분의 뷰는 ScrollTo() 방법을 직접 호출하여 Scroller 객체의 X 및 Y 좌표 값을 변경합니다.그러나 도표는 조금 다르다. 현재 Y축의 좌표로 도표의 넓이 각도를 설정한다.
if (!mScroller.isFinished()) {
    mScroller.computeScrollOffset();
    setPieRotation(mScroller.getCurrY());
}

Scroller 클래스는 스크롤 축의 위치를 계산할 수 있지만, 자동으로 보기에 좌표의 위치를 제공할 수 없습니다.스크롤 애니메이션을 원활하게 보일 수 있도록 좌표를 확보하고 적용해야 한다.다음과 같은 두 가지 방법이 있습니다.
보기를 다시 그릴 수 있도록 fling () 를 호출한 다음postInvalidate () 를 호출합니다.이 기술은 스크롤축의 변화를 보상할 때마다onDraw () 방법에서 스크롤축의 변화를 계산하고postInvalidate () 방법을 호출해야 한다.
슬라이딩 동작이 지속되는 상태를 동적으로 모의하고addUpdateListener () 를 호출하여 감청자가 애니메이션을 업데이트하는 것을 추가합니다.
도표는 두 번째 방법을 사용한다.이런 방법은 만들 때 약간 더 복잡해 보이지만, 애니메이션 시스템과 더욱 밀접하게 협조되고 불필요한 무효 보기가 필요하지 않다.그것의 결함은 API11보다 낮은 버전에서ValueAnimator는 사용할 수 없기 때문에 이런 방법은 안드로이드3보다 낮게 사용할 수 없다는 것이다.0 시스템의 디바이스에 있습니다.
알림:ValueAnimator는 API11보다 낮은 버전에서는 사용할 수 없지만, 응용 프로그램에서 이 종류를 사용하고 API 버전이 너무 낮다고 표시할 수 있습니다.프로그램이 실행될 때 현재 API 버전을 확인해야 합니다. 현재 API 버전이 11보다 낮으면 보기 애니메이션 시스템에서 이 호출을 무시해야 합니다.
mScroller = new Scroller(getContext(), null, true);
mScrollAnimator = ValueAnimator.ofFloat(0,1);
mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {           
@Override           
public void onAnimationUpdate(ValueAnimator valueAnimator) {               
if(!mScroller.isFinished()){                   
mScroller.computeScrollOffset();
setPieRotation(mScroller.getCurrY());               
} else {                   
mScrollAnimator.cancel();                   
onScrollFinished();               
}           
}       
});

원활한 인터페이스
사용자들은 현대적인 UI가 원활하게 상태 사이를 전환할 수 있기를 기대한다.UI 요소의 페이드 아웃이 직접 나타나거나 사라지는 대신 사용됩니다.각종 조작은 갑작스러운 시작과 정지가 아니라 자연스러운 방식으로 시작되고 끝난다.안드로이드 3.0 시스템에 도입된property animation 프레임워크는 원활한 전환을 간단하게 합니다.애니메이션 시스템을 사용할 때 모든 보기 속성의 변화는 보기의 외관에 영향을 줄 수 있으므로 보기의 속성을 직접 바꾸지 마십시오.대신 Value Animator를 사용하여 보기 속성을 변경할 수 있습니다.아래의 예에서 현재 도표에서 선택한 떡 조각을 수정하면 전체 도표가 회전하여 선택한 점을 선택한 슬라이스에 집중시킬 수 있습니다.ValueAnimator는 갑작스럽게 회전의 상태를 바꾸는 것이 아니라 짧은 시간 안에 회전의 변화를 실현한다.
mAutoCenterAnimator = ObjectAnimator.ofInt(PieChart.this,"PieRotation",0); 
mAutoCenterAnimator.setIntValues(targetAngle);
mAutoCenterAnimator.setDuration(AUTOCENTER_ANIM_DURATION);
mAutoCenterAnimator.start();

기본 View의 속성 값을 변경하려면 뷰 애니메이션을 변경하는 것이 좋습니다. 뷰에 포함된 ViewPropertyAnimator 클래스가 있기 때문에 동기화된 다중 속성 애니메이션을 최적화합니다.예를 들면 다음과 같습니다.
animate().rotation(targetAngle).setDuration(ANIM_DURATION).start();

좋은 웹페이지 즐겨찾기