Android 개발 의 ProgressBar 글꼴 은 진행 막대 가 불 러 올 때 스크롤 합 니 다.
9946 단어 progressBar진도 표로드굴러가다
저 는 LICEcap 소프트웨어 로 녹음 한 gif 그림 을 사용 하고 있 습 니 다.효과 가 약간 떨 어 졌 습 니 다.어떤 인형 이 gif 를 녹음 하 는 소프트웨어 가 있 는 지 알려 주세요.동생 은 여기 서 먼저 감 사 를 드 립 니 다.
먼저 xml 코드 를 보 세 요.두 개의 시스템 컨트롤 만 있 고 하나의 TextView 와 하나의 ProgressBar 만 있 습 니 다.Button 은 진도 바 의 효 과 를 편리 하 게 터치 하기 위해 실제 프로젝트 에서 수요 에 따라 할 수 있 습 니 다.우선 xml 의 코드 를 보십시오.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="5dp">
<TextView
android:layout_marginTop="50dp"
android:id="@+id/progress_precent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0%"
android:textColor="#ff00"
android:textSize="12sp"
android:padding="3dp"/>
<ProgressBar
android:id="@+id/pb_progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="5dp"
android:max="100"
android:progress="0"
android:progressDrawable="@drawable/progressbar_color" />
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="start" />
</LinearLayout>
스타일:progressbarcolor.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- gradient ,corners -->
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dp" />
<solid android:color="#9a9a9a" />
</shape>
</item>
<!-- -->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dp" />
<solid android:color="#E14f50" />
</shape>
</clip>
</item>
</layer-list>
onCreate()방법 에서 컨트롤 의 폭 을 얻 을 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
// progressBar
ViewTreeObserver vto2 = pbProgressbar.getViewTreeObserver();
vto2.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
pbProgressbar.getViewTreeObserver().removeGlobalOnLayoutListener(this);
width = pbProgressbar.getWidth();
Log.i("TAG", "MainActivity onCreate()=="+pbProgressbar.getWidth());
}
});
먼저 구체 적 인 실현 방향 을 말 한 다음 에 최종 코드 를 붙인다.사고방식 을 실현 하 는 것 은 우리 가 ProgressBar 가 최대 치 에 도달 해 야 할 때 TextView 의 위치 가 가장 먼 곳 으로 이동 하 는 것 이다.progressBar 의 임의의 백분율 을 얻 으 려 면 백분율 에 대응 하 는 위치 로 이동 할 수 있 습 니 다.우 리 는 모든 백분율 로 이동 하 는 거 리 를 알 아야 합 니 다.아직 분명하게 말 하지 못 하면 아래 의 공식 을 보면 더 잘 이해 할 수 있다.
// 진도 항목 의 가장 작은 단 위 는 기본적으로 1 이 고 너 도 다른 수치 일 수 있다.나 는 demo 에서 편리 하 게 1 을 사용 했다.
진도 바 의 최소 단위/진도 바 의 최대 값=백분율 로 이동 하 는 거리/총 거리(컨트롤 의 총 너비)
유도 가능:
모든 백분율 로 거 리 를 이동 합 니 다=(진도 바 의 최소 단위/진도 바 의 최대 값)*총 거리(컨트롤 의 총 너비)
모 바 일 애니메이션 효 과 를 해 야 하기 때문에 우 리 는 ANR 을 피하 기 위해 직접 스 레 드 를 열 어 인터페이스 를 제어 합 니 다.주요 코드 는 다음 과 같 습 니 다.
//
new Thread(new Runnable() {
@Override
public void run() {
//
scrollDistance = (float) ((1.0 / pbProgressbar.getMax()) * width);
for (int i = 1; i <= status; i++) {
runOnUiThread(new Runnable() {
@Override
public void run() {
currentStatue++;
currentPosition += scrollDistance;
pbProgressbar.incrementProgressBy(1);
//
progressPrecent.setTranslationX(currentPosition);
progressPrecent.setText(currentStatue + "%");
}
});
try {
Thread.sleep(80);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
큰 성 과 를 거 두 었 으 나 우리 가 실 행 했 을 때 ProgressBar 가 최대 치 에 이 르 렀 을 때 위의 글꼴 은 화면 범 위 를 넘 어 보이 지 않 았 다.효 과 는 그림 과 같다.이것 은 사용자 에 게 큰 곤 혹 스 러 움 을 주 었 습 니 다.마음 을 가 라 앉 히 고 분석 해 보면 TextView 가 ProgressBar 데이터 의 오른쪽 에 있 고 언어 기초 가 좋 지 않다 는 것 을 알 수 있 습 니 다.위 그림 을 보 겠 습 니 다.
이 를 통 해 알 수 있 듯 이 데이터 가 0%일 때 progressBar 에 대응 하 는 데이터 의 오른쪽 에 있 고 데이터 가 최대 치 일 때 화면 을 초과 하여 표시 하지 못 하면 부족 하 다.현재 progressBar 가 최대 치 일 때 도 표시 하려 면 오프셋 거리 에 글꼴 의 너비 와 글꼴 오른쪽 에 있 는 Padding 값 이 progressBar 너비 보다 클 때 오프셋 되 지 않 아야 합 니 다.이어서 코드 를 다음 과 같이 수정 합 니 다.
//
new Thread(new Runnable() {
@Override
public void run() {
//
scrollDistance = (float) ((1.0 / pbProgressbar.getMax()) * width);
for (int i = 0; i < status; i++) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//
pbProgressbar.incrementProgressBy(1);
currentStatue++;
tvPrecent.setText(currentStatue + "%");
//
tvWidth = tvPrecent.getWidth();
currentPosition += scrollDistance;
//
//
if (tvWidth + currentPosition <= width - tvPrecent.getPaddingRight()) {
tvPrecent.setTranslationX(currentPosition);
}
}
});
try {
Thread.sleep(80);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
우 리 는 실행 을 하고 효 과 를 살 펴 보 자.여기까지 만 하면 우 리 는 완성 할 것 입 니 다.잘 모 르 거나 잘못 쓴 곳 이 있 으 면 댓 글 의 지적 을 환영 합 니 다.제 가 제일 먼저 대답 하 겠 습 니 다.원본 코드 가 필요 한 친 구 는 github 에 가서 다운로드 할 수 있 고 두 손 으로 github 주 소 를 보 낼 수 있 습 니 다ProgressBar 가 불 러 올 때 글꼴 을 스크롤 합 니 다.
총결산
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 개발 의 ProgressBar 글꼴 입 니 다.진도 바 가 불 러 오 면서 구 르 는 것 이 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!