programing

ImageView(이미지 보기)에서 "애니메이션 서클"을 사용하여 작업 로드

skycolor 2023. 10. 19. 22:10
반응형

ImageView(이미지 보기)에서 "애니메이션 서클"을 사용하여 작업 로드

현재 애플리케이션에서 목록 보기를 사용하고 있는데, 이 보기는 1초 정도만 표시해야 합니다.

현재 제가 하는 일은 목록 보기의 @id/android:empty 속성을 사용하여 "로딩" 텍스트를 만드는 것입니다.

 <TextView android:id="@id/android:empty"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="#FF0000"
           android:text="Loading..."/>

이제 이 텍스트 대신 로딩 대화상자에서 사용되는 애니메이션 원으로 대체하고자 합니다. 여러분 모두 무슨 뜻인지 알고 계실 것 같습니다.

편집: 대화 상자를 원하지 않습니다.저는 제 레이아웃 안에 그것을 보여주고 싶습니다.

http://flexfwd.com/DesktopModules/ATI_Base/resources/images/loading_blue_circle.gif

도와주셔서 정말 감사합니다!

활동 레이아웃 파일에 이 xml 블록을 넣기만 하면 됩니다.

<RelativeLayout
    android:id="@+id/loadingPanel"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true" />
</RelativeLayout>

그리고 로딩이 끝나면 다음 한 줄로 전화를 걸어 주십시오.

findViewById(R.id.loadingPanel).setVisibility(View.GONE);

결과(그리고 회전도 가능):

enter image description here

다음 xml을 사용하여 이 작업을 수행할 수 있습니다.

<RelativeLayout
    style="@style/GenericProgressBackground"
    android:id="@+id/loadingPanel"
    >
    <ProgressBar
        style="@style/GenericProgressIndicator"/>
</RelativeLayout>

이런 스타일로

<style name="GenericProgressBackground" parent="android:Theme">
    <item name="android:layout_width">fill_parent</item>    
    <item name="android:layout_height">fill_parent</item>
    <item name="android:background">#DD111111</item>    
    <item name="android:gravity">center</item>  
</style>
<style name="GenericProgressIndicator" parent="@android:style/Widget.ProgressBar.Small">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:indeterminate">true</item> 
</style>

이를 사용하려면 가시성 값을 GONE으로 설정하여 UI 요소를 숨기고 데이터가 로드될 때마다 호출해야 합니다.setVisibility(View.VISIBLE)당신의 모든 견해를 복원할 수 있습니다.잊지말고 전화해요.findViewById(R.id.loadingPanel).setVisiblity(View.GONE)로딩 애니메이션을 숨길 수 있습니다.

로딩 이벤트/기능이 없지만 x초 후에 로딩 패널이 사라지기를 원하는 경우 Handle을 사용하여 Hidden/Showing을 트리거합니다.

이를 일반적으로 "불확정 진행률 막대" 또는 "불확정 진행률 대화상자"라고 합니다.

이것을 스레드핸들러와 결합하면 원하는 것을 정확하게 얻을 수 있습니다.구글이나 SO를 통해 이 작업을 수행하는 방법에 대한 많은 예가 있습니다.저는 이런 과제를 수행하기 위해 이 조합의 수업을 활용하는 방법을 배우는 데 시간을 할애하는 것을 적극 추천합니다.여러 종류의 응용 프로그램에서 매우 유용하며 쓰레드와 핸들러가 함께 작동하는 방법에 대한 통찰력을 얻을 수 있습니다.

이것이 어떻게 작동하는지에 대해 말씀드리겠습니다.

로딩 이벤트가 대화상자를 시작합니다.

//maybe in onCreate
showDialog(MY_LOADING_DIALOG);
fooThread = new FooThread(handler);
fooThread.start();

이제 실이 작동합니다.

private class FooThread extends Thread {
    Handler mHandler;

    FooThread(Handler h) {
        mHandler = h;
    }

    public void run() { 
        //Do all my work here....you might need a loop for this

        Message msg = mHandler.obtainMessage();
        Bundle b = new Bundle();                
        b.putInt("state", 1);   
        msg.setData(b);
        mHandler.sendMessage(msg);
    }
}

완료되면 최종적으로 스레드에서 상태를 가져옵니다.

final Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        int state = msg.getData().getInt("state");
        if (state == 1){
            dismissDialog(MY_LOADING_DIALOG);
            removeDialog(MY_LOADING_DIALOG);
        }
    }
};

firebase github 샘플에서 이 코드를 사용할 수 있습니다.

레이아웃 파일에서 편집할 필요가 없습니다...새 클래스 "Base Activity" 만들기

package com.example;

import android.app.ProgressDialog;
import android.support.annotation.VisibleForTesting;
import android.support.v7.app.AppCompatActivity;


public class BaseActivity extends AppCompatActivity {

    @VisibleForTesting
    public ProgressDialog mProgressDialog;

    public void showProgressDialog() {
        if (mProgressDialog == null) {
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("Loading ...");
            mProgressDialog.setIndeterminate(true);
        }

        mProgressDialog.show();
    }


    public void hideProgressDialog() {
        if (mProgressDialog != null && mProgressDialog.isShowing()) {
            mProgressDialog.dismiss();
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        hideProgressDialog();
    }

}

진행률 대화 상자를 사용할 Activity(활동)에서..

public class MyActivity extends BaseActivity

시간이 소요되는 기능 전후

showProgressDialog();
.... my code that take some time
showProgressDialog();

진행 상황을 나타내기 위해 다른 보기를 부풀리지 않으려면 다음을 수행합니다.

  1. 목록 보기의 동일한 XML 레이아웃에 ProgressBar를 만듭니다.
  2. 중심으로 만들기
  3. 도움을 주세요.
  4. setEmptyView를 호출하여 목록 보기 인스턴스 변수에 연결합니다.

안드로이드는 진행 표시줄의 가시성을 관리할 것입니다.

예를 들어, 인activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.fcchyd.linkletandroid.MainActivity">

    <ListView
        android:id="@+id/list_view_xml"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@color/colorDivider"
        android:dividerHeight="1dp" />

   <ProgressBar
        android:id="@+id/loading_progress_xml"
        style="?android:attr/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

</RelativeLayout>

그리고 인.MainActivity.java:

package com.fcchyd.linkletandroid;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {

final String debugLogHeader = "Linklet Debug Message";
Call<Links> call;
List<Link> arraylistLink;
ListView linksListV;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    linksListV = (ListView) findViewById(R.id.list_view_xml);
    linksListV.setEmptyView(findViewById(R.id.loading_progress_xml));
    arraylistLink = new ArrayList<>();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.links.linklet.ml")
            .addConverterFactory(GsonConverterFactory
                    .create())
            .build();

    HttpsInterface HttpsInterface = retrofit
            .create(HttpsInterface.class);

    call = HttpsInterface.httpGETpageNumber(1);

    call.enqueue(new Callback<Links>() {
        @Override
        public void onResponse(Call<Links> call, Response<Links> response) {
            try {
                arraylistLink = response.body().getLinks();

                String[] simpletTitlesArray = new String[arraylistLink.size()];
                for (int i = 0; i < simpletTitlesArray.length; i++) {
                    simpletTitlesArray[i] = arraylistLink.get(i).getTitle();
                }
                ArrayAdapter<String> simpleAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, simpletTitlesArray);
                linksListV.setAdapter(simpleAdapter);
            } catch (Exception e) {
                Log.e("erro", "" + e);
            }
        }

        @Override
        public void onFailure(Call<Links> call, Throwable t) {

        }
    });


}

}

Kotlin에서 발전하는 것들을 위해, Anko 도서관에서 제공하는 달콤한 방법이 있습니다. 그것은 전시하는 과정을 만듭니다.ProgressDialog미풍!

해당 링크를 기준으로:

val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()

진행률 %가 표시되는 진행률 대화 상자가 표시됩니다(이 대화 상자를 통과해야 함).init진행률을 계산하기 위한 매개변수도 포함).

또한 있습니다.indeterminateProgressDialog()method는 Spinning Circle 애니메이션을 종료할 때까지 무한히 제공합니다.

indeterminateProgressDialog("Loading...").show()

제가 이 해결책을 찾게 된 이 블로그에 큰 소리쳐 보세요.

언급URL : https://stackoverflow.com/questions/5442183/using-the-animated-circle-in-an-imageview-while-loading-stuff

반응형