Android 텍스트 상하 스크롤 효과 구현
하 나 는 TextView 에 뒤 집 힌 애니메이션 효 과 를 추가 하고 순환 스크롤 을 설정 합 니 다.하 나 는 ViewPager 의 스크롤 방향 을 바 꾸 어 아래 에서 위로 스크롤 하고 순환 스크롤 을 설정 하 는 것 입 니 다.
먼저 첫 번 째 방법 을 소개 합 니 다.
사고 실현:TextView 를 사용자 정의 하고 TextView 에 아래 에서 위로 스크롤 하 는 애니메이션 효 과 를 추가 한 다음 에 순환 재생 을 설정 합 니 다.
TextView 를 계승 할 수 있 도록 AutoTextView 를 만 든 다음 onDraw 방법 에서 getHeight()방법 으로 textview 의 현재 높이 를 가 져 옵 니 다.
다음 애니메이션 반전 효과 에서 이 높이 에 따라 TextView 의 상하 스크롤 거 리 를 설정 합 니 다.다음은 애니메이션 실현 방법 입 니 다.
/**
*
*/
private void animationStart() {
ObjectAnimator translate = ObjectAnimator.ofFloat(this, "translationY", 0, -height);
ObjectAnimator alpha = ObjectAnimator.ofFloat(this, "alpha", 1f, 0f);
mAnimStart = new AnimatorSet();
mAnimStart.play(translate).with(alpha);
mAnimStart.setDuration(DURATION);
mAnimStart.addListener(this);
}
/**
*
*/
public void animationOver() {
ObjectAnimator translate = ObjectAnimator.ofFloat(this, "translationY", height, 0);
ObjectAnimator alpha = ObjectAnimator.ofFloat(this, "alpha", 0f, 1f);
mAnimOver = new AnimatorSet();
mAnimOver.play(translate).with(alpha);
mAnimOver.setDuration(DURATION);
}
다음은 ObjectAnimator 의 감청 이 벤트 를 실현 합 니 다.onAnimationEnd 에서 setText 방법 을 호출 하여 애니메이션 에서 텍스트 업 데 이 트 를 한 번 도 끝내 지 않 고 애니메이션 효 과 를 계속 수행 합 니 다.
@Override
public void onAnimationEnd(Animator animator) {
super.setText(mText);
if (mAnimOver == null) {
animationOver();
}
mAnimOver.start();
}
그 다음 에 순환 스크롤 을 설정 할 수 있 는 클래스 를 호출 합 니 다.여 기 는 Scheduled ExecutorService 를 사용 할 수도 있 고 Timer 몇 가지 설정 으로 시간 스크롤 을 사용 할 수도 있 습 니 다.UI 를 업데이트 할 때 Handler 방법 으로 업데이트 할 수도 있 습 니 다.타이머 로 정시 작업 을 수행 할 때 하나의 스 레 드 만 만 들 기 때문에 Scheduled Executor Service 를 사용 하 는 것 을 권장 합 니 다.
/**
*
* @param textView
* @param list
* @param autoPlayTime
*/
public void getTextData(final IdeaAutoTextview textView, List<String> list, int autoPlayTime) {
this.textView = textView;
this.textList = list;
if (autoPlayTime != 0) {
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleWithFixedDelay(new WeakTimerTask(this), autoPlayTime, autoPlayTime, TimeUnit.SECONDS);
}
}
private TimeTaskHandler mHandler = new TimeTaskHandler(this);
private static class WeakTimerTask extends TimerTask {
private WeakReference<IdeaAutoTextview> autoTextReference;
public WeakTimerTask(IdeaAutoTextview mautoText) {
this.autoTextReference = new WeakReference<>(mautoText);
}
@Override
public void run() {
IdeaAutoTextview autoText = autoTextReference.get();
if (autoText != null) {
if (autoText.isShown()) {
autoText.mHandler.sendEmptyMessage(0);
}
} else {
cancel();
}
}
}
정시 갱신 빈도 가 비교적 높 아 메모리 누 출 이 발생 하기 쉬 우 므 로 약 한 인용 으로 이 상황 이 발생 하지 않도록 한다.
private final class TimeTaskHandler extends Handler {
private WeakReference<IdeaAutoTextview> autoTextReference;
public TimeTaskHandler(IdeaAutoTextview autoText) {
this.autoTextReference = new WeakReference<>(autoText);
}
@Override
public void handleMessage(Message msg) {
IdeaAutoTextview autoText = autoTextReference.get();
if (autoText!=null)
{
/**
*
*/
String text = textList.get(index);
index++;
if (index > textList.size() - 1) {
index = 0;
}
textView.setAutoText(text);
}
}
}
여기 서 첫 번 째 방법 을 소개 하 겠 습 니 다.두 번 째 방법 으로 실현 되 는 원 리 는 윤 방도 의 원리 와 유사 하 다.윤 방도 는 보통 좌우 로 가로로 굴 러 가 는데 여 기 는 ViewPager 를 상하 미끄럼 으로 바 꾸 어야 한다.상하 미끄럼 에 관 한 viewpager 는 github 에서 찾 을 수 있다.
그 다음 에 윤 방 도 에서 재생 하 는 것 은 그림 이 고 그림 을 문자 로 바 꾸 면 된다.
그 다음 에 Timer 나 Scheduled Executor Service 를 호출 하여 ViewPager 를 자동 으로 스크롤 합 니 다.
다음은 코드:
package com.idea.idea.viewutils;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.widget.RelativeLayout;
import java.lang.ref.WeakReference;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* todo: ViewPager
*
* @author: Create by qjj
* @email: [email protected]
*/
public class AutoViewpager extends RelativeLayout{
private VerticalViewPager mVerticalViewPager;
private PagerAdapter mAdapter;
private int autoPlayTime;
private ScheduledExecutorService scheduledExecutorService;
public AutoViewpager(Context context){
this(context,null);
}
public AutoViewpager(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AutoViewpager(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
/**
* view
*/
private void initView(){
if(mVerticalViewPager!=null){
removeView(mVerticalViewPager);
}
mVerticalViewPager = new VerticalViewPager(getContext());
mVerticalViewPager.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
addView(mVerticalViewPager);
}
private final static class TimeTaskHandler extends Handler {
private WeakReference<AutoViewpager> mRollPagerViewWeakReference;
public TimeTaskHandler(AutoViewpager autoViewpager) {
this.mRollPagerViewWeakReference = new WeakReference<>(autoViewpager);
}
@Override
public void handleMessage(Message msg) {
AutoViewpager autoViewpager = mRollPagerViewWeakReference.get();
int cur = autoViewpager.getViewPager().getCurrentItem()+1;
if(cur>= autoViewpager.mAdapter.getCount()){
cur=0;
}
autoViewpager.getViewPager().setCurrentItem(cur);
}
}
private TimeTaskHandler mHandler = new TimeTaskHandler(this);
private static class WeakTimerTask extends TimerTask {
private WeakReference<AutoViewpager> mRollPagerViewWeakReference;
public WeakTimerTask(AutoViewpager mAutoViewpager) {
this.mRollPagerViewWeakReference = new WeakReference<>(mAutoViewpager);
}
@Override
public void run() {
AutoViewpager autoViewpager = mRollPagerViewWeakReference.get();
if (autoViewpager !=null){
if(autoViewpager.isShown()){
autoViewpager.mHandler.sendEmptyMessage(0);
}
}else{
cancel();
}
}
}
/**
*
*/
private void autoPlay(){
if(autoPlayTime<=0||mAdapter == null||mAdapter.getCount()<=1){
return;
}
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleWithFixedDelay(new WeakTimerTask(this), autoPlayTime, autoPlayTime, TimeUnit.SECONDS);
}
public void setAutoTime(int autoPlayTime){
this.autoPlayTime = autoPlayTime;
autoPlay();
}
/**
* viewpager
* @return
*/
public ViewPager getViewPager() {
return mVerticalViewPager;
}
/**
* Adapter
* @param adapter
*/
public void setAdapter(PagerAdapter adapter){
mVerticalViewPager.setAdapter(adapter);
mAdapter = adapter;
dataChanged();
}
private void dataChanged(){
autoPlay();
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.