Saya mencoba untuk mendapatkan koordinat piksel layar absolut dari sudut kiri atas tampilan. Namun, semua metode yang saya dapat temukan seperti getLeft()
dan getRight()
tidak berfungsi karena semuanya tampaknya relatif terhadap pandangan orang tua, sehingga memberi saya 0
. Apa cara yang tepat untuk melakukan ini?
Jika ini membantu, ini adalah untuk permainan 'kembalikan gambar ke urutan'. Saya ingin pengguna dapat menggambar kotak untuk memilih beberapa bagian. Asumsi saya adalah bahwa cara termudah untuk melakukan itu adalah ke getRawX()
dan getRawY()
dari MotionEvent
dan kemudian membandingkan nilai-nilai itu terhadap sudut kiri atas tata letak memegang potongan-potongan. Mengetahui ukuran potongan, saya kemudian dapat menentukan berapa banyak potongan yang telah dipilih. Saya menyadari bahwa saya dapat menggunakan getX()
dan getY()
pada MotionEvent
, tetapi karena itu mengembalikan posisi relatif yang membuat menentukan potongan mana yang dipilih lebih sulit. (Bukan tidak mungkin, saya tahu, tetapi tampaknya tidak perlu rumit).
Sunting: Ini adalah kode yang saya gunakan untuk mencoba mendapatkan ukuran wadah penampung, sesuai salah satu pertanyaan. TableLayout
adalah meja yang menampung semua potongan puzzle.
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());
Sunting 2: Ini kode yang sudah saya coba, mengikuti lebih banyak jawaban yang disarankan.
public int[] tableLayoutCorners = new int[2];
(...)
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
+ ", " + corners.bottom);
cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);
Kode ini ditambahkan setelah semua inisialisasi dilakukan. Gambar telah dibagi menjadi array dari ImageViews (array sel []) yang terkandung dalam a TableLayout
. Sel [0] adalah kiri atas ImageView
, dan saya mengambil sel [4] karena berada di suatu tempat di tengah dan pasti tidak memiliki koordinat (0,0).
Kode yang ditunjukkan di atas masih memberi saya semua 0s dalam log, yang saya benar-benar tidak mengerti karena berbagai potongan puzzle ditampilkan dengan benar. (Saya mencoba int publik untuk tableLayoutCorners dan visibilitas default, keduanya memberikan hasil yang sama.)
Saya tidak tahu apakah ini signifikan, tetapi ImageView
s awalnya tidak diberi ukuran. Ukuran ImageView
s ditentukan selama inisialisasi secara otomatis oleh Tampilan ketika saya memberikan gambar untuk ditampilkan. Bisakah ini berkontribusi pada nilainya menjadi 0, meskipun kode pencatatan setelah mereka diberikan gambar dan secara otomatis mengubah ukurannya sendiri? Untuk mencegahnya, saya menambahkan kode tableLayout.requestLayout()
seperti yang ditunjukkan di atas, tetapi itu tidak membantu.
sumber
Jawaban yang diterima sebenarnya tidak memberi tahu bagaimana cara mendapatkan lokasi, jadi di sini ada sedikit lebih detail. Anda melewatkan
int
array dengan panjang 2 dan nilainya diganti dengan koordinat tampilan (x, y) (dari sudut atas, kiri).Catatan
getLocationOnScreen
dengangetLocationInWindow
harus memberikan hasil yang sama dalam banyak kasus (lihat jawaban ini ). Namun, jika Anda berada di jendela yang lebih kecil seperti Dialog atau papan ketik khusus, maka gunakan Anda harus memilih mana yang lebih sesuai dengan kebutuhan Anda.(0,0)
jika Anda memanggil metode inionCreate
karena tampilan belum ditata. Anda dapat menggunakan aViewTreeObserver
untuk mendengarkan ketika tata letak selesai dan Anda bisa mendapatkan koordinat yang diukur. (Lihat jawaban ini .)sumber
Pertama, Anda harus mendapatkan persegi panjang viewVisible lokal
Untuk misalnya:
Semoga ini bisa membantu
sumber
getGlobalVisibleRect()
untuk coord mutlak.Menggunakan pendengar tata letak global selalu bekerja dengan baik untuk saya. Ini memiliki keuntungan karena dapat mengukur kembali hal-hal jika tata letak diubah, misalnya jika sesuatu diatur ke View.GONE atau tampilan anak ditambahkan / dihapus.
sumber
setContentView()
menyebabkan masalah khususActivity
di aplikasi saya! Itu adalah aktivitas dialog (windowFrame:@null, windowActionBar:false, windowIsFloating:true, windowNoTitle:true
). Tata letak utamanya (aLinearLayout
) belum ditentukan oleh anak langsunglayout_width
(Semuanya adalahmatch_parent
atauwrap_content
).Mengikuti komentar Romain Guy, inilah cara saya memperbaikinya. Semoga ini bisa membantu orang lain yang juga punya masalah ini.
Saya memang mencoba untuk mendapatkan posisi pandangan sebelum ditampilkan di layar, tetapi tidak jelas apa yang terjadi. Baris-baris itu ditempatkan setelah kode initilisasi berjalan, jadi saya berasumsi semuanya sudah siap. Namun, kode ini masih di onCreate (); dengan bereksperimen dengan Thread.sleep () saya menemukan bahwa tata letak sebenarnya belum selesai sampai setelah onCreate () semua jalan ke onResume () selesai dieksekusi. Jadi memang, kode itu mencoba dijalankan sebelum tata letak selesai diposisikan di layar. Dengan menambahkan kode ke OnClickListener (atau Listener lain), nilai yang benar diperoleh karena hanya bisa diaktifkan setelah tata letak selesai.
Baris di bawah ini disarankan sebagai edit komunitas:
mohon gunakan
onWindowfocuschanged(boolean hasFocus)
sumber
setContentView(R.layout.something)
, tetapi belum dimuat secara visual. Mereka tidak memiliki ukuran, atau posisi. Itu tidak terjadi sampai pass tata letak pertama selesai, yang terjadi di beberapa titik di masa depan (umumnya setelah onResume ()).Cara pertama:
Di Kotlin kita dapat membuat ekstensi sederhana untuk tampilan:
Dan cukup dapatkan koordinat:
Jalan kedua:
Cara kedua lebih sederhana:
dan cukup dapatkan X absolut oleh
view.absX()
dan Y olehview.absY()
sumber
val location = IntArray(2).apply(::getLocationOnScreen)
Utils saya berfungsi untuk mendapatkan lokasi tampilan, itu akan mengembalikan
Point
objek denganx value
dany value
Menggunakan
sumber
Anda bisa mendapatkan koordinat Tampilan menggunakan
getLocationOnScreen()
ataugetLocationInWindow()
Setelah itu,
x
dany
harus menjadi sudut kiri atas tampilan. Jika tata letak root Anda lebih kecil dari layar (seperti dalam Dialog), menggunakangetLocationInWindow
akan relatif terhadap wadahnya, bukan seluruh layar.Solusi Java
Untuk memastikan tampilan memiliki kesempatan untuk memperbarui, jalankan permintaan lokasi Anda setelah tata letak baru View telah dihitung dengan menggunakan
view.post
:~~
Solusi Kotlin
Untuk memastikan tampilan memiliki kesempatan untuk memperbarui, jalankan permintaan lokasi Anda setelah tata letak baru View telah dihitung dengan menggunakan
view.post
:Saya sarankan membuat fungsi ekstensi untuk menangani ini:
Dan jika Anda membutuhkan keandalan, tambahkan juga:
sumber
Gunakan kode ini untuk menemukan kordinat X dan Y yang tepat:
Saya telah menambahkan / mengurangi beberapa nilai untuk menyesuaikan tampilan saya. Harap lakukan baris-baris ini hanya setelah seluruh tampilan meningkat.
sumber
Dapatkan Tampilan Posisi dan Dimensi di layar
sumber
Hanya sebagai tambahan dari jawaban di atas, untuk pertanyaan di mana dan kapan Anda harus menelepon
getLocationOnScreen
?Dalam informasi apa pun yang terkait dengan tampilan apa pun yang ingin Anda dapatkan, itu hanya akan tersedia setelah tampilan diletakkan di layar. Anda dapat dengan mudah melakukan ini dengan meletakkan kode Anda yang bergantung pada pembuatan tampilan di dalam ini (view.post (Runnable)):
sumber