Android Studio - Wallpaper
Hola amigos en esta ocasión les enseñare a crear un Wallpaper en nuestra aplicación, sera un fondo de pantalla cambiante.
Para crear un fondo de pantalla en vivo, debe crear un archivo XML que describa su fondo de pantalla. Este archivo debe contener una descripción de la aplicación y puede contener una vista previa y un enlace a una Actividad de actividad preferida que permite personalizar el fondo de pantalla en vivo.
También creas un servicio que debe extender la WallpaperService clase. Esta clase es la clase base para todos los fondos de pantalla en vivo en el sistema. Debe implementar el onCreateEngine() método y devolver un objeto de tipo android.service.wallpaper.WallpaperService.Engine. Este objeto maneja los eventos del ciclo de vida, las animaciones y los dibujos del fondo de pantalla. La Engine clase define los métodos de ciclo de vida, como por ejemplo onCreate(), onSurfaceCreated(), onVisibilityChanged(), onOffsetsChanged(),onTouchEvent() y onCommand().
El servicio requiere el permiso android.permission.BIND_WALLPAPER y debe registrarse a través de un filtro de intención para la android.service.wallpaper.WallpaperService acción.
También debe ingresar el archivo AndroidManifest.xml de la aplicación en que su aplicación usa la android.software.live_wallpaper función. Esto evitará que su fondo de pantalla se pueda instalar en dispositivos que no admitan fondos de pantalla animados.
Crear Aplicación Android (Aquí).
Vamos a crear nuestra aplicación para continuar con este ejemplo de Wallpaper en Android.Android Wallpaper Example.
Comenzaremos creando el diseño de nuestro Wallpaper. Nos dirigimos al directorio Res de nuestro proyecto. Y crearemos una carpeta a la cual llamaremos XML.Ahora teniendo esto listo agregaremos en el directorio Values / strings.xml. La siguiente etiqueta String.
<string name="wallpaper_description">My first wallpaper</string>
Vamos a copiar dentro de nuestro directorio Drawable la siguiente imagen. Aquí
Y dentro del nuevo directorio que hemos creado XML agregaremos los siguientes dos Layout.
mywallpaper.xml
<?xml version="1.0" encoding="UTF-8"?>
<wallpaper
android:settingsActivity="de.vogella.android.wallpaper.MyPreferencesActivity"
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/wallpaper_description"
android:thumbnail="@drawable/icon" />
prefs.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference android:key="touch"
android:title="Enable Touch"></CheckBoxPreference>
<EditTextPreference android:key="numberOfCircles"
android:title="Number of Circles"></EditTextPreference>
</PreferenceScreen>
Ahora por ultimo agregaremos en nuestro activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:onClick="onClick"/>
</LinearLayout>
Android Wallpaper Example
Continuamos con nuestro código en nuestras clases Java para programar nuestra aplicación Wallpaper.Agregaremos una clase Java a la cual llamaremos. MyPoint. Y este sera el resultado.
public class MyPoint {
public String text;
public float x;
public float y;
public MyPoint(String text, float x, float y) {
this.text = text;
this.x = x;
this.y = y;
}
}
Continuamos con la siguiente clase. MyWallpaperService.
import android.content.SharedPreferences;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import java.util.ArrayList;
import java.util.List;
public class MyWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new MyWallpaperEngine();
}
private class MyWallpaperEngine extends Engine {
private final Handler handler = new Handler();
private final Runnable drawRunner = new Runnable() {
@Override
public void run() {
draw();
}
};
private List<MyPoint> circles;
private Paint paint = new Paint();
private int width;
int height;
private boolean visible = true;
private int maxNumber;
private boolean touchEnabled;
public MyWallpaperEngine() {
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(MyWallpaperService.this);
maxNumber = Integer
.valueOf(prefs.getString("numberOfCircles", "4"));
touchEnabled = prefs.getBoolean("touch", false);
circles = new ArrayList<MyPoint>();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(10f);
handler.post(drawRunner);
}
@Override
public void onVisibilityChanged(boolean visible) {
this.visible = visible;
if (visible) {
handler.post(drawRunner);
} else {
handler.removeCallbacks(drawRunner);
}
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
this.visible = false;
handler.removeCallbacks(drawRunner);
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
this.width = width;
this.height = height;
super.onSurfaceChanged(holder, format, width, height);
}
@Override
public void onTouchEvent(MotionEvent event) {
if (touchEnabled) {
float x = event.getX();
float y = event.getY();
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.BLACK);
circles.clear();
circles.add(new MyPoint(
String.valueOf(circles.size() + 1), x, y));
drawCircles(canvas, circles);
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
super.onTouchEvent(event);
}
}
private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
if (circles.size() >= maxNumber) {
circles.clear();
}
int x = (int) (width * Math.random());
int y = (int) (height * Math.random());
circles.add(new MyPoint(String.valueOf(circles.size() + 1),
x, y));
drawCircles(canvas, circles);
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
handler.removeCallbacks(drawRunner);
if (visible) {
handler.postDelayed(drawRunner, 5000);
}
}
// Surface view requires that all elements are drawn completely
private void drawCircles(Canvas canvas, List<MyPoint> circles) {
canvas.drawColor(Color.BLACK);
for (MyPoint point : circles) {
canvas.drawCircle(point.x, point.y, 20.0f, paint);
}
}
}
}
La siguiente clase es. MyPreferencesActivity.
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.widget.Toast;
public class MyPreferencesActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
// Queremos agregar un validador a la cantidad de círculos para que solo
// acepta números
Preference circlePreference = getPreferenceScreen().findPreference("numberOfCircles");
// Agrega el validador
circlePreference.setOnPreferenceChangeListener(numberCheckListener);
}
/**
* Comprueba que una preferencia es un valor numérico válido
*/
Preference.OnPreferenceChangeListener numberCheckListener = new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Verifique que la cadena sea un número entero
if (newValue != null && newValue.toString().length() > 0
&& newValue.toString().matches("\\d*")) {
return true;
}
// Si ahora crea un mensaje para el usuario
Toast.makeText(MyPreferencesActivity.this, "Entrada Inválida",
Toast.LENGTH_SHORT).show();
return false;
}
};
}
Y por ultimo nos quedara esta. SetWallpaperActivity.
import android.app.Activity;
import android.app.WallpaperManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class SetWallpaperActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(this, MyWallpaperService.class));
startActivity(intent);
}
}
Con esto tendremos listo nuestro ejemplo y podremos ejecutar nuestra aplicación para poder ver el resultado del Wallpaper.
Crear Emulador AVD (Aquí)
Crearemos el emulador para ver nuestra aplicación y obtendremos el siguiente resultado.
Espero el tutorial haya sido de tu agrado compártelo para promover el conocimiento.
- Eric S. Raymond
No hay comentarios:
Publicar un comentario