Saya ingin menggunakan efek marquee pada TextView, tetapi teks hanya digulir saat TextView mendapatkan fokus. Itu masalah, karena dalam kasus saya, tidak bisa.
Saya menggunakan:
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
Apakah ada cara agar TextView selalu menggulir teksnya? Saya telah melihat ini dilakukan di aplikasi Android Market, di mana nama aplikasi akan bergulir di bilah judul, meskipun tidak menerima fokus, tetapi saya tidak dapat menemukan hal ini disebutkan dalam dokumen API.
Jawaban:
Saya telah menghadapi masalah dan solusi terpendek yang saya dapatkan adalah membuat kelas baru yang berasal dari TextView. Kelas harus mengganti tiga metode onFocusChanged , onWindowFocusChanged , dan isFocused untuk membuat TextView semuanya terfokus.
sumber
Saya akhirnya menemukan masalah ini hari ini dan mulai
hierarchyviewer
menggunakan aplikasi Android Market.Melihat judul di layar detail aplikasi, mereka menggunakan yang lama
TextView
. Memeriksa propertinya menunjukkan bahwa itu tidak fokus, tidak bisa fokus dan umumnya sangat biasa - kecuali fakta bahwa itu ditandai sebagai terpilih .Satu baris kode kemudian dan saya berhasil :)
Ini masuk akal, mengingat apa yang dikatakan Javadoc :
yaitu Saat Anda menggulir item dalam tampilan daftar (seperti di aplikasi Market), baru kemudian teks yang sekarang dipilih mulai bergulir. Dan karena ini
TextView
tidak dapat difokuskan atau diklik, status pemilihannya tidak akan pernah hilang.Sayangnya, sejauh yang saya tahu tidak ada cara untuk mengatur keadaan yang dipilih dari tata letak XML.
Tapi satu baris di atas berfungsi dengan baik untuk saya.
sumber
TextView
(yaitu yang tidak tertanam dalam sesuatu yang "dapat dipilih" seperti aListView
) akan mengubah keadaan yang dipilih.TextView
dokumentasi dan lihatandroid:marqueeRepeatLimit
.Letakkan saja parameter ini di TextView Anda. Berhasil :)
sumber
TranslateAnimation
bekerja dengan "menarik" View ke satu arah dengan jumlah tertentu. Anda dapat mengatur di mana untuk memulai "penarikan" ini dan di mana harus mengakhirinya.fromXDelta mengatur offset posisi awal gerakan di sumbu X.
toXDelta mendefinisikan posisi akhir offset dari gerakan di sumbu X.
Jika lebar teks Anda lebih besar dari modul perbedaan antara fromXDelta dan toXDelta, teks tidak akan dapat sepenuhnya dan benar-benar bergerak di dalam layar.
Contoh
Anggaplah ukuran layar kita 320x240 px. Kami memiliki TextView dengan teks yang memiliki lebar 700px dan kami ingin membuat animasi yang "menarik" teks tersebut sehingga kami dapat melihat akhir frasa.
Pertama kita atur
fromXDelta = 0
agar pergerakan tidak memiliki offset awal. Sekarang kita perlu mencari nilai toXDelta. Untuk mencapai efek yang diinginkan, kita perlu "menarik" teks dengan piksel yang sama persis dengan yang membentang di luar layar. (dalam skema diwakili oleh <<<< X px >>>>) Karena teks kita memiliki lebar 700, dan area yang terlihat adalah 320px (lebar layar) yang kita atur:Dan bagaimana kita menghitung Lebar Layar dan Lebar teks?
Kode
Mengambil Cuplikan Zarah sebagai titik awal:
Mungkin ada cara yang lebih mudah untuk melakukan ini, tetapi ini berfungsi untuk setiap tampilan yang dapat Anda pikirkan dan dapat digunakan kembali. Ini sangat berguna jika Anda ingin menganimasikan TextView dalam ListView tanpa merusak kemampuan aktif / onFocus dari textView. Itu juga menggulir terus menerus bahkan jika Tampilan tidak fokus.
sumber
textView.setSelected(true);
tidak berfungsi dalam situasi Anda?Saya tidak tahu apakah Anda masih membutuhkan jawabannya, tetapi saya menemukan cara mudah untuk melakukannya.
Siapkan animasi Anda seperti ini:
START_POS_X
,END_POS_X
,START_POS_Y
DanEND_POS_Y
adalahfloat
nilai-nilai, sedangkanTICKER_DURATION
merupakanint
Saya menyatakan dengan konstanta saya yang lain.Kemudian Anda sekarang dapat menerapkan animasi ini ke TextView Anda:
Dan itu dia. :)
Animasi saya dimulai di sisi kanan off-screen (300f) dan berakhir di sisi kiri off-screen (-300f), dengan durasi 15s (15000).
sumber
Saya menulis kode berikut untuk ListView dengan item teks marquee. Ini didasarkan pada solusi setSelected yang dijelaskan di atas. Pada dasarnya, saya memperluas kelas ArrayAdapter dan mengganti metode getView untuk memilih TextView sebelum mengembalikannya:
sumber
Ini adalah jawaban yang muncul di bagian atas pencarian google saya jadi saya pikir saya bisa memposting jawaban yang berguna di sini karena saya kesulitan mengingat ini cukup sering. Bagaimanapun, ini berfungsi untuk saya dan membutuhkan atribut XML dan A onFocusChangeListener.
sumber
// xml
// Di Jawa
sumber