Vor langer Zeit hatte meine Mutter eine Anwendung am Telefon, mit der ich die Helligkeit des Bildschirms ändern konnte, indem ich mit dem Finger über den linken Rand fuhr. Mama gewöhnte sich an ihn und wechselte dann zu einem neuen Telefon und dort verschwand diese Anwendung bereits aus dem Laden. Nachdem ich keine Analoga gefunden hatte, beschloss ich, sie selbst zu schreiben und ihr zum Geburtstag zu geben. Eine schrittweise Anleitung zum Erstellen und zum Ergebnis finden Sie in diesem Artikel.
Zum Erstellen dieser Anwendung benötigen wir zwei Berechtigungen: die Berechtigung zum Ändern der Systemeinstellungen (direktes Anpassen der Helligkeit) und die Berechtigung zum Überlagern anderer Anwendungen. Beide Berechtigungen, da Android 6.0 nicht einfach durch Angabe im Manifest abgerufen werden kann, müssen separat vom Benutzer angefordert werden.
Die Struktur unserer Anwendung sieht wie folgt aus: Die Hauptaktivität besteht aus zwei Schaltflächen. Eine startet den Dienst, zeichnet die SeekBar zur Steuerung der Helligkeit und die zweite beendet diesen Dienst. Beginnen wir mit unserer Haupttätigkeit. So sieht die Markup-Datei aus:
Markup mainActivity<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/startService" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="27dp" android:text=" " /> <Button android:id="@+id/stopService" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/startService" android:layout_below="@+id/startService" android:layout_marginTop="39dp" android:text=" " /> </LinearLayout>
Und so wird die Aktivität selbst aussehen:
mainActivity import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
Erstellen wir nun den BrightnessChekingService-Dienst, dessen Funktionen ich oben bereits angegeben habe. Vergessen Sie nicht - falls Sie es manuell erstellen, müssen Sie es im Manifest registrieren
BrightnessChekingService import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.Build; import android.os.IBinder; import android.provider.Settings; import android.view.Gravity; import android.view.WindowManager; import android.widget.SeekBar; public class BrightnessChekingService extends Service{ private WindowManager windowManager; private WindowManager.LayoutParams params; private VerticalSeekBar seekBar; private Context context; public void onCreate () { super.onCreate();
Und schließlich erstellen wir eine Klasse VerticalSeekBar, die eine benutzerdefinierte Version einer regulären SeekBar ist. Der Unterschied besteht darin, dass sich unsere SeekBar vertikal befindet
VerticalSeekBar import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.SeekBar; public class VerticalSeekBar extends SeekBar { public VerticalSeekBar (Context context) { super(context); } public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public VerticalSeekBar(Context context, AttributeSet attrs) { super(context, attrs); } protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(h, w, oldh, oldw); } public synchronized void setProgress(int progress) { super.setProgress(progress); onSizeChanged(getWidth(), getHeight(), 0, 0); } protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); } protected void onDraw(Canvas c) { c.rotate(-90); c.translate(-getHeight(), 0); super.onDraw(c); } @Override public boolean onTouchEvent(MotionEvent event) { if (!isEnabled()) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: setProgress(getMax() - (int) (getMax() * event.getY() / getHeight())); onSizeChanged(getWidth(), getHeight(), 0, 0); break; case MotionEvent.ACTION_CANCEL: break; } return true; } }
So sieht das Anwendungsmanifest aus:
Manifest <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.bright"> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".BrightnessChekingService" android:enabled="true" android:exported="true"></service> </application> </manifest>
Das ist alles, ein einfaches, aber mit einer Seele gemachtes Geburtstagsgeschenk für Mama ist fertig. Wir haben so etwas:


Zur Demonstration habe ich die Linie entfernt, die die Transparenz festlegt, da in diesem Modus der Streifen fast unsichtbar ist. Falls gewünscht, können Sie Schaltflächen hinzufügen, die die Größe des Streifens, seine Position auf dem Bildschirm und die Transparenz regulieren.
Hier können Sie die Apkshnik nehmen. Wenn jemand es benutzen wird, würde ich gerne ein Feedback bekommen, da ich es nur auf dem siebten Android getestet habe. Und ich möchte denjenigen meinen tiefen Dank aussprechen, die die Anwendung bereits testen und Fehler melden - Sie helfen mir unglaublich. Vielen Dank!