android - superposicion - superposición de pantalla j7
Mostrar una superposición de carga en la pantalla de Android (5)
Me gusta el enfoque en la respuesta de Kostya But .
Sobre la base de eso, aquí hay algunas ideas para hacer que la misma superposición sea fácilmente reutilizable en su aplicación:
Considere poner la superposición FrameLayout en un archivo de diseño separado, por ejemplo, res/layout/include_progress_overlay
:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progress_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.4"
android:animateLayoutChanges="true"
android:background="@android:color/black"
android:clickable="true"
android:visibility="gone">
<ProgressBar
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"/>
</FrameLayout>
(Una cosa que agregué en la superposición de FrameLayout es android:clickable="true"
. Así que mientras se muestra la superposición, evita que los clics pasen a los elementos de la interfaz de usuario debajo de ella. Al menos en mis casos de uso típicos, esto es lo que quiero).
Luego incluirlo cuando sea necesario:
<!-- Progress bar overlay; shown while login is in progress -->
<include layout="@layout/include_progress_overlay"/>
Y en código:
View progressOverlay;
[...]
progressOverlay = findViewById(R.id.progress_overlay);
[...]
// Show progress overlay (with animation):
AndroidUtils.animateView(progressOverlay, View.VISIBLE, 0.4f, 200);
[...]
// Hide it (with animation):
AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200);
Con código de animación extraído en un método util:
/**
* @param view View to animate
* @param toVisibility Visibility at the end of animation
* @param toAlpha Alpha at the end of animation
* @param duration Animation duration in ms
*/
public static void animateView(final View view, final int toVisibility, float toAlpha, int duration) {
boolean show = toVisibility == View.VISIBLE;
if (show) {
view.setAlpha(0);
}
view.setVisibility(View.VISIBLE);
view.animate()
.setDuration(duration)
.alpha(show ? toAlpha : 0)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(toVisibility);
}
});
}
(Aquí usando view.animate()
, agregado en API 12, en lugar de AlphaAnimation
).
Estoy mirando para mostrar una superposición sobre la pantalla que muestra un poco de ticker de carga o posiblemente incluso un poco de texto mientras mi aplicación intenta iniciar sesión en el servidor. Mi pantalla de inicio de sesión está dentro de un diseño lineal vertical.
El efecto que estoy tratando de lograr es algo como esto: http://docs.xamarin.com/recipes/ios/standard_controls/popovers/display_a_loading_message
Se puede crear una rueda giratoria con un mensaje sobre la aplicación utilizando un ProgressDialog. Si bien no logra el efecto exacto como en la imagen, es una buena manera de demostrar que la aplicación está funcionando.
Tal vez demasiado tarde, pero creo que alguien podría encontrarlo útil.
Actividad:
public class MainActivity extends Activity implements View.OnClickListener {
String myLog = "myLog";
AlphaAnimation inAnimation;
AlphaAnimation outAnimation;
FrameLayout progressBarHolder;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
progressBarHolder = (FrameLayout) findViewById(R.id.progressBarHolder);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
new MyTask().execute();
break;
}
}
private class MyTask extends AsyncTask <Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
button.setEnabled(false);
inAnimation = new AlphaAnimation(0f, 1f);
inAnimation.setDuration(200);
progressBarHolder.setAnimation(inAnimation);
progressBarHolder.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
outAnimation = new AlphaAnimation(1f, 0f);
outAnimation.setDuration(200);
progressBarHolder.setAnimation(outAnimation);
progressBarHolder.setVisibility(View.GONE);
button.setEnabled(true);
}
@Override
protected Void doInBackground(Void... params) {
try {
for (int i = 0; i < 5; i++) {
Log.d(myLog, "Emulating some task.. Step " + i);
TimeUnit.SECONDS.sleep(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
}
Diseño xml:
<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"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start doing stuff"
android:id="@+id/button"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Do Some Stuff"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<FrameLayout
android:id="@+id/progressBarHolder"
android:animateLayoutChanges="true"
android:visibility="gone"
android:alpha="0.4"
android:background="#000000"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
android:layout_gravity="center" />
</FrameLayout>
</RelativeLayout>
Tengo ProgressBar en Diseño relativo y lo oculto o muestro respectivamente. Y sí, la actividad puede ser transparente.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/hsvBackgroundContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
</LinearLayout>
<ProgressBar
android:id="@+id/pbProgess"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
Tienes que hacer una operación en segundo plano usando un concepto de hilo como AsyncTask. Al usar esto, puede ocultar el trabajo real de la parte UI. Y AsyncTask no se asignará una vez que se completen sus operaciones.
- Crear una subclase de AsyncTask
- Use AsyncTask para hacer trabajos en segundo plano
- Call onPreExecute () para inicializar la tarea
- Use una barra de progreso con setIndeterminate (verdadero) para habilitar el modo indeterminado
- Llame a OngressUpdate () para animar su barra de progreso para que el usuario sepa que se está realizando algún trabajo.
- Use incrementProgressBy () para incrementar el contenido de la barra de progreso por un valor específico
- Llame a doInBackground () y haga el trabajo de fondo aquí
- Capture un objeto InterruptedException para encontrar el final de la operación de fondo
- Llame a onPostExecute () para indicar el final de la operación y mostrar el resultado
Tutorial de ProgressDialog indeterminado de Android
Pantalla de bienvenida al cargar recursos en la aplicación de Android