2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

HorizontalScrollView의 스크롤 애니메이션 속도를 조정하는 방법은?

_____
Q1: Android의 HorizontalScrollView에서 스크롤 애니메이션 속도를 어떻게 조정할 수 있나요?
A1: HorizontalScrollView는 기본적으로 직접 스크롤을 제어하는 애니메이션 속도 조절 API를 제공하지 않습니다. 하지만 스크롤 속도를 변경하려면 커스텀 스크롤러(Scroller)를 사용하는 방법이 일반적입니다.

---

Q2: 커스텀 Scroller를 통해 HorizontalScrollView의 스크롤 속도를 조절하는 방법은?
A2: HorizontalScrollView의 내부 Scroller를 커스텀 Scroller로 교체하여, `startScroll()` 메서드에서 애니메이션 지속 시간을 조절할 수 있습니다.
구현 단계는 다음과 같습니다:

1. `Scroller` 클래스를 상속받아 커스텀 Scroller 클래스 작성
2. 커스텀 Scroller에서 `startScroll()` 메서드를 오버라이드하여 duration 값을 원하는 속도로 변경
3. 커스텀 HorizontalScrollView 클래스를 만들어 내부 Scroller를 커스텀 Scroller로 교체 (리플렉션 사용)
4. 해당 HorizontalScrollView를 레이아웃에 적용 후 scrollTo 또는 smoothScrollTo 호출 시 조절된 속도로 애니메이션됨

---

Q3: 커스텀 Scroller 예제(Java)
```java
public class SpeedyScroller extends Scroller {
private int mDuration = 500; // 기본 500ms

public SpeedyScroller(Context context) {
super(context);
}

public void setDuration(int duration) {
mDuration = duration;
}

@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
// 커스텀 duration 사용
super.startScroll(startX, startY, dx, dy, mDuration);
}

@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
}
```

---

Q4: HorizontalScrollView에 커스텀 Scroller 적용하기(Java)
```java
public class CustomHorizontalScrollView extends HorizontalScrollView {
private SpeedyScroller mScroller = null;

public CustomHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
postInitScroller();
}

private void postInitScroller() {
try {
Field scrollerField = HorizontalScrollView.class.getDeclaredField("mScroller");
scrollerField.setAccessible(true);
mScroller = new SpeedyScroller(getContext());
scrollerField.set(this, mScroller);
} catch (Exception e) {
e.printStackTrace();
}
}

public void setScrollDuration(int duration) {
if (mScroller != null) {
mScroller.setDuration(duration);
}
}
}
```

---

Q5: 스크롤 속도 변경 후 적용 방법은?
A5: XML에서 `CustomHorizontalScrollView`를 사용하거나 코드에서 뷰를 생성 후, 아래처럼 속도를 변경해서 사용합니다.
```java
customHorizontalScrollView.setScrollDuration(1000); // 1초에 애니메이션
customHorizontalScrollView.smoothScrollTo(targetX, 0);
```

---

Q6: Kotlin 예제
```kotlin
class SpeedyScroller(context: Context) : Scroller(context) {
var duration = 500

override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
super.startScroll(startX, startY, dx, dy, this.duration)
}

override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int) {
super.startScroll(startX, startY, dx, dy, duration)
}
}

class CustomHorizontalScrollView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : HorizontalScrollView(context, attrs) {
private var mScroller: SpeedyScroller? = null

init {
try {
val scrollerField = HorizontalScrollView::class.java.getDeclaredField("mScroller")
scrollerField.isAccessible = true
mScroller = SpeedyScroller(context)
scrollerField.set(this, mScroller)
} catch (e: Exception) {
e.printStackTrace()
}
}

fun setScrollDuration(duration: Int) {
mScroller?.duration = duration
}
}
```

---

요약:
- HorizontalScrollView 기본 API는 스크롤 애니메이션 속도 조절 지원 X
- 커스텀 Scroller 상속 후, `startScroll` 메서드의 duration 값을 제어 가능
- Reflection으로 `mScroller`를 커스텀 Scroller로 교체하여 쉽게 속도 변경
- 속도 변경 후 `smoothScrollTo()` 호출 시 변경된 속도로 스크롤 애니메이션 실행

이 방법을 응용하면 원하는 스크롤 애니메이션 속도를 쉽게 조절할 수 있습니다.
Android에서 `HorizontalScrollView`의 스크롤 애니메이션 속도를 조정하려면, 기본적으로 제공되는 메서드들을 사용자 정의하여 사용할 수 있습니다.

`HorizontalScrollView` 클래스 자체는 스크롤 애니메이션의 속도를 직접적으로 조정할 수 있는 API를 제공하지 않지만, 커스텀 스크롤링을 구현할 수 있습니다.

여기서 `ValueAnimator`를 사용하여 스크롤 애니메이션의 속도를 조정하는 방법을 소개하겠습니다.

1. HorizontalScrollView 확장 클래스 생성 : `HorizontalScrollView`를 확장하여 새로운 클래스에서 스크롤 속도를 조정하는 메서드를 구현합니다.



2. 애니메이션 구현 : `ValueAnimator`를 사용해 애니메이션을 조정합니다.

아래는 해당 방법에 대한 예제 코드입니다.

```java import android.content.Context; import android.util.AttributeSet; import android.view.animation.AccelerateInterpolator; import android.widget.HorizontalScrollView; import android.animation.ValueAnimator; public class CustomHorizontalScrollView extends HorizontalScrollView { public CustomHorizontalScrollView(Context context) { super(context); } public CustomHorizontalScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void smoothScrollTo(int x, int duration) { // 현재 스크롤 위치 final int startX = getScrollX(); // 종료 스크롤 위치 final int dx = x - startX; // ValueAnimator 생성 ValueAnimator animator = ValueAnimator.ofInt(0, dx); animator.setDuration(duration); // 설정한 duration (밀리초 단위) animator.setInterpolator(new AccelerateInterpolator()); // 속도 변화 설정 animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int scrollX = startX + (int) animation.getAnimatedValue(); scrollTo(scrollX, 0); // 수평으로 스크롤 } }); animator.start(); // 애니메이션 시작 } } ``` 사용 방법 위의 커스텀 `HorizontalScrollView`를 XML에서 사용하려면 아래와 같이 설정할 수 있습니다.

```xml ``` 그리고, Activity 또는 Fragment에서 다음과 같이 사용할 수 있습니다.

```java CustomHorizontalScrollView scrollView = findViewById(R.id.customScrollView); scrollView.smoothScrollTo(500, 1000); // 500px 위치로 1000ms 동안 스크롤 ``` 결론 위와 같이 `HorizontalScrollView`의 애니메이션 속도를 조정하려면 `ValueAnimator`를 사용하여 구현할 수 있습니다.

이 방법을 이용하면 스크롤 효과를 더욱 부드럽고 세밀하게 제어할 수 있습니다.

작성자: 박하윤 [비회원] | 작성일자: 1년 전 2025-04-19 11:21:22
조회수: 157 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.