如何添加真正的载入画面

时间:2017-08-21 08:39:25

标签: android splash-screen

我在里面有一个pdf文件的android应用程序。当我在较低配置的设备(galaxy 2等)上打开我的应用程序时,加载PDF文件需要一段时间。我尝试在我的应用程序中添加启动画面,但在MainActivity.class仍然占用相同时间之后打开SplashScreen。如何开发真正的加载屏幕?它应该在Main Activity图层之上工作。 这里是我的代码:

  

的AndroidManifest.xml

        <activity
            android:name=".SplashScreen"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity"></activity>
    </application>
</manifest>
  

SplashScreen.class

public class SplashScreen extends AppCompatActivity {
    private GifImageView gifImageView;
    private ProgressBar progressBar;
    Handler handler;

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

        gifImageView=(GifImageView)findViewById(R.id.gifview);
        progressBar=(ProgressBar)findViewById(R.id.progressbar);
        progressBar.setVisibility(progressBar.VISIBLE);

        try {
            InputStream inputStream = getAssets().open("loading.gif");
            byte[] bytes  = IOUtils.toByteArray(inputStream);
            gifImageView.setBytes(bytes);
            gifImageView.startAnimation();
        }
        catch (IOException ex)
        {
        }

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                    Intent intent = newIntent(SplashScreen.this,MainActivity.class);
                    SplashScreen.this.startActivity(intent);
                    SplashScreen.this.finish();
            }
        },12000);
    }
}

在这里我的代码如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

您是否考虑过使用异步任务? 您可以在MainActivity中使用异步任务。

例如,您可以执行以下操作:

class PDFLoader extends AsyncTask<Void, Void, Void>
{
    protected void onPreExecute (){
        super.onPreExecute();
       // Here you can instantiate the Progressdialog to show the progress.

    }
    protected String doInBackground(Void...arg0) {
        // here you can go ahead write the reading logic for the PDF
       // if it is taking time.
    }
    protected void onProgressUpdate(Integer...a){
        super.onProgressUpdate(a);
       // you may or may not use this. This can act as a progress updated based on
       // the integer.
    }
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        // Here you can dismiss the progress bar since the read as been done.
    }
}

在MainActivity中将其命名为:

new PDFLoader().execute();

我希望这会对你有所帮助。 这只是让您入门的基本结构。更多信息here

答案 1 :(得分:0)

使用启动画面不是解决方案。您正在添加一个12秒间隔的屏幕,12秒后MainActivity类正在执行。 因此,您可以直接在MainActivity类中添加进度条,并且可以使用 AsyncTask 来解决此问题。 AsyncTask有3种方法 - OnPreExecute,doInBackground,OnPostExecute。在这里,您可以在OnPreExecute方法中添加进度条和在doInBackground方法中打开PDF文件的代码,最后在OnPostExecute方法中停止进度条。

如需更多帮助,请在此处提供 MainActivity 类代码。

答案 2 :(得分:0)

您可以创建 LoadingScreen 而不是启动画面(查看12秒延迟)。这可能会有所帮助:

public class LoadingScreen {private ImageView loading;

LoadingScreen(ImageView loading) {
this.loading = loading;
}

public void setLoadScreen(){
final Integer[] loadingImages = {R.mipmap.loading_1, R.mipmap.loading_2, 
R.mipmap.loading_3, R.mipmap.loading_4};
final Handler loadingHandler = new Handler();
Runnable runnable = new Runnable() {
    int loadingImgIndex = 0;
    public void run() {
        loading.setImageResource(loadingImages[loadingImgIndex]);
        loadingImgIndex++;
        if (loadingImgIndex >= loadingImages.length)
            loadingImgIndex = 0;
        loadingHandler.postDelayed(this, 500);//change to accordingly(i.e. 12000)
    }
};
loadingHandler.postDelayed(runnable, 500); // change it accordingly
}}

在MainActivity中,您可以像这样传递给LoadingScreen类: -

private ImageView loadingImage;

不要忘记在activity_main中添加ImageView。之后,像这样调用Lo​​adingScreen类;

 LoadingScreen loadingscreen = new LoadingScreen(loadingImage);
loadingscreen.setLoadScreen();

创建自定义加载屏幕而不是Splash屏幕总是有帮助。也不要忘记添加一些不同的图像,使其感觉像 gif ,之后添加图像res文件夹。我也检查了它的低版本因此,相信它可能符合你的目的......

答案 3 :(得分:0)

你应该试一试这篇文章:https://antonioleiva.com/branded-launch-screen/ 它比Splash Screen好得多,因为它会为你的MainActivity加载异步

将此代码添加到样式:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar" />
   <style name="AppTheme.BrandedLaunch" parent="AppTheme">
        <item name="android:windowBackground">@drawable/branded_logo</item>
   </style>

现在将braded_logo.xml创建到drawable目录

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <color android:color="@color/background_material_light"/>
    </item>
    <item>
        <bitmap
            android:src="@drawable/launch_logo_image"
            android:tileMode="disabled"
            android:gravity="center"/>
    </item>
</layer-list>

并将该样式分配到您的MainActivity

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.BrandedLaunch">

最后将setStyle添加到MainActivity中onCreate的默认主题

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
...

答案 4 :(得分:0)

现在很多应用程序都因为UI / UX不好而无法加载屏幕。您可以使用替代内容加载。这个article可能会有所帮助。你可以在很多流行的应用程序上看到这种实现,如Facebook,LinkedIn,Upwork等。