Membuat widget penyesuaian kecerahan yang bagus

Dahulu kala, ibu saya memiliki aplikasi di telepon yang memungkinkan saya untuk mengubah kecerahan layar dengan menggesekkan jari saya di sepanjang tepi kiri. Ibu terbiasa dengannya, dan kemudian beralih ke telepon baru dan di sana aplikasi itu sudah menghilang dari toko. Sebenarnya, setelah tidak menemukan analog, saya memutuskan untuk menulis sendiri dan memberikannya untuk ulang tahunnya. Panduan langkah demi langkah untuk membuat dan hasilnya ada di artikel ini.

Untuk membuat aplikasi ini, kita memerlukan dua izin - izin untuk mengubah pengaturan sistem (langsung menyesuaikan kecerahan) dan izin untuk overlay di atas aplikasi lain. Kedua izin ini karena Android 6.0 tidak dapat diperoleh hanya dengan menentukannya dalam manifes - keduanya harus diminta secara terpisah dari pengguna.

Struktur aplikasi kita adalah sebagai berikut - aktivitas utama, yang akan memiliki dua tombol - satu akan memulai layanan, yang akan menarik SeekBar untuk mengontrol kecerahan, dan yang kedua akan menghentikan layanan ini. Mari kita mulai dengan kegiatan utama kita. Seperti inilah tampilan file markup:
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> 


Dan di sini adalah bagaimana kegiatan itu sendiri akan terlihat:
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); //  ,   Android  ,    6   -     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES .M) { if (!Settings.System.canWrite(getApplicationContext())) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName())); Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(myIntent); startActivity(intent); } else { } } final Button startService = (Button) findViewById(R.id.startService); final Button stopService = (Button) findViewById(R.id.stopService); startService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startService(new Intent(getApplication(), BrightnessChekingService.class)); } }); stopService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopService(new Intent(getApplication(), BrightnessChekingService.class)); } }); } } 


Sekarang mari kita membuat layanan BrightnessChekingService, fungsinya sudah saya tunjukkan di atas. Jangan lupa - jika Anda membuatnya secara manual, Anda harus mendaftarkannya di manifes
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(); //    ,     Android,          int LAYOUT_FLAG; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE; } windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); context = this.getApplicationContext(); seekBar = new VerticalSeekBar(context); seekBar.setMax(255); float alpha = (float) 0.1; seekBar.setAlpha(alpha); params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.MATCH_PARENT, LAYOUT_FLAG, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); params.gravity = Gravity.START; params.x = 0; params.y = 0; params.height = 700; windowManager.addView(seekBar, params); int Brightnes = Settings.System.getInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 0); seekBar.setProgress(Brightnes); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ public void onProgressChanged(SeekBar seekBar, int i, boolean b) { Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,i); //    ,      seekBar   Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); } public void onStartTrackingTouch(SeekBar seekBar) { } public void onStopTrackingTouch (SeekBar seekBar) { } }); } public void onDestroy() { super.onDestroy(); if (seekBar != null) windowManager.removeView(seekBar); } @Override public IBinder onBind(Intent intent) { return null; } } 


Dan akhirnya, mari kita buat kelas VerticalSeekBar yang akan menjadi versi kustom dari SeekBar biasa, perbedaannya adalah SeekBar kita akan ditempatkan secara vertikal
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; } } 


Inilah yang akan terlihat seperti manifes aplikasi:
Manifesto
 <?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> 


Itu saja, sederhana, tetapi dibuat dengan hadiah ulang tahun jiwa untuk ibu siap. Kami mendapat hal seperti itu:


Untuk demonstrasi, saya menghapus garis yang mengatur transparansi, karena dalam mode ini strip hampir tidak terlihat. Jika diinginkan, Anda dapat menambahkan tombol yang mengontrol ukuran strip, posisinya di layar dan transparansi.

Di sini Anda dapat mengambil apkshnik. Jika seseorang akan menggunakannya, saya ingin mendapatkan umpan balik, karena saya mengujinya hanya pada android ketujuh. Dan saya ingin mengucapkan terima kasih yang mendalam kepada mereka yang sudah menguji aplikasi dan melaporkan bug - Anda sangat membantu saya. Terima kasih

Source: https://habr.com/ru/post/id412967/


All Articles