Saya mencoba untuk membuat tombol selalu-op-top / diklik-gambar yang tetap di atas semua jendela sepanjang waktu.
Bukti konsepnya adalah
- di sini - Smart Taskbar (di AppBrain)
- dan di sini V1.4.0 Sidebar style SWKey - Tombol penyelamat (pada xda-developer)
Saya telah sukses dan memiliki layanan yang berjalan sekarang. Layanan ini menampilkan beberapa teks di sudut kiri atas layar sepanjang waktu sementara pengguna dapat secara bebas berinteraksi dengan aplikasi lainnya dengan cara normal.
Apa yang saya lakukan adalah subkelas ViewGroup
dan menambahkannya ke root window manager dengan flag TYPE_SYSTEM_OVERLAY
. Sekarang saya ingin menambahkan tombol / diklik-gambar di tempat teks ini yang dapat menerima peristiwa sentuhan itu sendiri. Saya mencoba mengganti "onTouchEvent" untuk keseluruhan ViewGroup
tetapi tidak menerima acara apa pun.
Bagaimana saya bisa menerima acara hanya pada bagian tertentu dari grup tampilan selalu di atas saya? Mohon saran.
public class HUD extends Service {
HUDView mView;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();
mView = new HUDView(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
0,
// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT | Gravity.TOP;
params.setTitle("Load Average");
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_LONG).show();
if(mView != null)
{
((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView);
mView = null;
}
}
}
class HUDView extends ViewGroup {
private Paint mLoadPaint;
public HUDView(Context context) {
super(context);
Toast.makeText(getContext(),"HUDView", Toast.LENGTH_LONG).show();
mLoadPaint = new Paint();
mLoadPaint.setAntiAlias(true);
mLoadPaint.setTextSize(10);
mLoadPaint.setARGB(255, 255, 0, 0);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("Hello World", 5, 15, mLoadPaint);
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//return super.onTouchEvent(event);
Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
return true;
}
}
onDraw()
dipanggil. BukankahdispatchDraw()
seharusnya diganti? Lihat groups.google.com/forum/?fromgroups#!topic/android-developers/…Jawaban:
Ini mungkin solusi bodoh. Tapi itu berhasil. Jika Anda dapat memperbaikinya, beri tahu saya.
OnCreate Layanan Anda: Saya telah menggunakan
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
bendera. Ini adalah satu-satunya perubahan dalam layanan.Sekarang, Anda akan mulai mendapatkan setiap klik acara. Jadi, Anda perlu memperbaikinya di event handler Anda.
Di acara sentuh ViewGroup Anda
Anda juga mungkin perlu menambahkan izin ini ke manifes Anda:
sumber
Mengikuti jawaban @ Sam Lu, Memang Android 4.x memblokir tipe tertentu dari mendengarkan acara sentuh luar, tetapi beberapa jenis, seperti
TYPE_SYSTEM_ALERT
, masih melakukan pekerjaan.Contoh
Izin
sumber
Dimulai dengan Android 4.x, tim Android memperbaiki masalah keamanan potensial dengan menambahkan fungsi baru
adjustWindowParamsLw()
yang akan ditambahkanFLAG_NOT_FOCUSABLE
,FLAG_NOT_TOUCHABLE
dan menghapusFLAG_WATCH_OUTSIDE_TOUCH
bendera untukTYPE_SYSTEM_OVERLAY
windows.Artinya, sebuah
TYPE_SYSTEM_OVERLAY
jendela tidak akan menerima acara sentuh apa pun pada platform ICS dan, tentu saja, menggunakanTYPE_SYSTEM_OVERLAY
bukanlah solusi yang bisa diterapkan untuk ICS dan perangkat masa depan.sumber
Saya salah satu pengembang SDK Tooleap . Kami juga menyediakan cara bagi pengembang untuk selalu menampilkan di jendela dan tombol atas, dan kami telah menangani situasi yang sama.
Satu masalah yang belum dijawab oleh jawaban di sini adalah "Tombol Terjamin" Android.
Tombol aman memiliki
filterTouchesWhenObscured
properti yang berarti tidak dapat berinteraksi dengan, jika ditempatkan di bawah jendela, bahkan jika jendela itu tidak menerima sentuhan apa pun. Mengutip dokumentasi Android:Contoh dari tombol tersebut adalah tombol instal ketika Anda mencoba menginstal apks pihak ketiga. Aplikasi apa pun dapat menampilkan tombol seperti itu jika menambahkan tata letak tampilan pada baris berikut:
Jika Anda menampilkan jendela selalu-di-atas di atas "Tombol Aman", maka semua bagian tombol aman yang ditutupi oleh overlay tidak akan menangani sentuhan apa pun, meskipun overlay itu tidak dapat diklik. Jadi jika Anda berencana untuk menampilkan jendela seperti itu, Anda harus menyediakan cara bagi pengguna untuk memindahkan atau mengabaikannya. Dan jika sebagian overlay Anda transparan, perhatikan bahwa pengguna Anda mungkin bingung mengapa tombol tertentu di aplikasi yang mendasarinya tidak bekerja untuknya secara tiba-tiba.
sumber
BEKERJA SELALU DI TOMBOL GAMBAR TOP
pertama-tama maaf untuk bahasa inggris saya
saya mengedit kode Anda dan membuat tombol gambar bekerja yang mendengarkan acara sentuh-nya tidak memberikan kontrol sentuh untuk elemen latar belakangnya.
juga memberikan sentuhan pendengar untuk keluar dari elemen lain
perubahan tombol di bagian bawah dan kiri
Anda dapat mengejar perubahan tetapi Anda harus mengejar koordinat dalam acara sentuhan di elemen if
sumber
Sebenarnya, Anda dapat mencoba WindowManager.LayoutParams.TYPE_SYSTEM_ERROR alih-alih TYPE_SYSTEM_OVERLAY. Mungkin terdengar seperti retasan, tetapi memungkinkan Anda menampilkan tampilan di atas segalanya dan masih mendapatkan acara sentuh.
sumber
TYPE_SYSTEM_OVERLAY Konstanta ini sudah tidak digunakan lagi sejak API level 26. Sebagai gantinya, gunakan TYPE_APPLICATION_OVERLAY. atau ** untuk pengguna di bawah dan di atas Android 8
sumber
Coba ini. Bekerja dengan baik di ICS. Jika Anda ingin menghentikan layanan cukup klik pemberitahuan yang dihasilkan di bilah status.
MEMPERBARUI
Sampel sini
Untuk membuat tampilan overlay, saat mengatur LayoutParams JANGAN mengatur tipe ke TYPE_SYSTEM_OVERLAY.
sumber
Berikut adalah beberapa solusi sederhana, Yang Anda butuhkan adalah mengembang tata letak XML seperti yang Anda lakukan pada daftar adaptor, hanya membuat tata letak XML untuk mengembangnya. Inilah kode yang Anda butuhkan.
sumber
Menemukan perpustakaan yang melakukan hal itu: https://github.com/recruit-lifestyle/FloatingView
Ada contoh proyek di folder root. Saya menjalankannya dan berfungsi sesuai kebutuhan. Latar belakang dapat diklik - meskipun aplikasi lain.
sumber
Itu menggunakan izin "android.permission.SYSTEM_ALERT_WINDOW" tutorial lengkap tentang tautan ini: http://androidsrc.net/facebook-chat-like-floating-chat-heads/
sumber
Coba kode saya, setidaknya itu memberi Anda string sebagai overlay, Anda bisa menggantinya dengan tombol atau gambar. Anda tidak akan percaya ini adalah LOL aplikasi android pertama saya. Bagaimanapun jika Anda lebih berpengalaman dengan aplikasi Android daripada saya, silakan coba
sumber
Jika ada yang masih membaca utas ini dan tidak bisa menjalankannya, saya sangat menyesal untuk memberitahu Anda cara untuk mencegat acara gerak ini dianggap sebagai bug dan diperbaiki di android> = 4.2.
Acara gerak yang Anda sadap, meskipun memiliki tindakan sebagai ACTION_OUTSIDE, mengembalikan 0 di getX dan getY. Ini berarti Anda tidak dapat melihat semua posisi gerakan di layar, Anda juga tidak dapat melakukan apa pun. Saya tahu dokter mengatakan itu akan mendapatkan x dan y, tetapi kenyataannya itu TIDAK AKAN. Tampaknya ini untuk memblokir logger kunci.
Jika ada yang punya solusi, silakan tinggalkan komentar Anda.
ref: Mengapa ACTION_OUTSIDE mengembalikan 0 setiap kali di KitKat 4.4.2?
https://code.google.com/p/android/issues/detail?id=72746
sumber
dengan menggunakan layanan Anda dapat mencapai ini:
sumber
Jawaban @Sarwar Erfan tidak berfungsi lagi karena Android tidak mengizinkan penambahan tampilan dengan WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY ke jendela yang dapat disentuh lagi bahkan dengan WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH.
Saya menemukan solusi untuk masalah ini. Anda dapat memeriksanya di pertanyaan berikut
Saat menambahkan tampilan ke jendela dengan WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, itu tidak mendapatkan acara sentuh
sumber
Ini adalah pertanyaan lama tetapi baru-baru ini Android memiliki dukungan untuk Bubbles. Bubbles akan segera diluncurkan tetapi saat ini pengembang dapat mulai menggunakannya. Mereka dirancang untuk menjadi alternatif untuk menggunakan
SYSTEM_ALERT_WINDOW
. Aplikasi seperti (Facebook Messenger dan MusiXMatch menggunakan konsep yang sama).Gelembung dibuat melalui API Pemberitahuan, Anda mengirim pemberitahuan seperti biasa. Jika Anda ingin menggelembung, Anda harus melampirkan beberapa data tambahan ke dalamnya. Untuk informasi lebih lanjut tentang Bubbles Anda dapat pergi ke Panduan Pengembang Android resmi tentang Bubbles .
sumber