Những kiến thức về View trong Android mà các bạn nên biết


Giới thiệu

Trong loạt các bài về Android mình viết về View khá là nhiều vì trong Android đi đâu bạn cũng đụng phải View ví dụ như các View thường xuyên sử dụng ví dụ EditText, Button, TextView, ImageView, RadioButton, CheckBox, ImageButton hay những view thuộc ViewGroup như FrameLayout, LinearLayout, RelativeLayout, TableLayout hayListView, Toolbar, RecyclerView,và mới đây trong Google 2016 cũng đã giới thiệu một View mới là ConstrainLayout. Và mình cũng đã có một thời gian dài làm việc với UI nên hôm nay mình viết một bài về View chia sẽ kinh nghiệm của mình về View trong Android.

Các bạn cũng có thể xem lại bài viết Các View cơ bản trong Android

Khái niệm View

Những gì chúng ta nhìn thấy trên màn hình thiết bị android được gọi là View (trong window thường được gọi là control). View được vẽ trên thiết bị android với một hình chữ nhật.

View có một sự ràng buộc chặt chẻ với dữ liệu. Ví dụ với ImageView thì data chính là bitmap, hay TextView thì có data chính là text. View sẽ dựa vào data để vẽ lên màn hình Android.

 

 

Ngoài ra View có thể tương tác với người dùng thông qua các action touch, drag, drop, v.v.  Với các action xảy ra trên view thì từ đó view sẽ được vẽ lại hay thay đổi kích thước hay là thay đổi data.

Để hiểu rõ hơn về View các bạn nên đọc mã nguồn của nó ở đây

Điều gì xảy ra khi bạn add một View vào ViewGroup

Khi chúng ta add một View và một ViewGroup (FrameLayout, LinearLayout, RelativeLayout) thì các method sau sẽ được gọi.

Các phương thức sẽ được chạy từ trên xuống dưới. Và dưới đây mình sẽ giải thích một số phương thức để các bạn hiểu rõ hơn.

Construct

Chắc mình cũng không có gì để nói về phần này vì đơn giản nó làm hàm tạo. Kiến thức basic của OOP phải không nào.

onAttachedToWindow()

Phương thức này đươc gọi khi chúng ta attach view vào Window

onMeasure

Phương thức này là phương thức rất quan trọng của view. Phương thức này là phương thức tính toán, ước lượng kích thước cho View. Trong phương thức này sau khi bạn tính toán xong kích thức phải gọi phương thức setMeasuredDimension() để set width và height cho view.

Dưới đây là phương thức onMeasure

Hai giá trị widthMeasureSpect, heightMeasureSpec là hai giá trị mà ViewGroup truyền xuống. Mỗi tham số này sẽ có hai giá trị chứ trong nó đó là

+ Giá trị kích thước (width, height)

+ Giá trị MeasureSpec gồm có ba giá trị là EXACTLY, AT_MOST, UNSPECIFIED

Với từng giá trị có ý nghĩa như sau:
+ MeasureSpec.EXACTLY: View sẽ có kích thước xác định theo giá trị của người dùng set. Trường hợp này xảy ra nếu set layout_width hoặc layout_height là một con số xác định hoặc là match_parent.

+ MeasureSpec.AT_MOST: View sẽ có kích thước nhỏ hơn hoặc bằng đúng giá trị của kích thước của parent.

+ MeasureSpec.UNSPECIFIED. View sẽ có kích thước như nó mong muốn (có thể lớn hơn kích thước của parent). Trường hợp xảy ra nếu layout_width hoặc layout_height có gía trị là wrap_content.

Lưu ý: Phương thức này được gọi nhiều lần

Nếu bạn đã từng gặp lỗi bạn getWidth và getHeight của View mà return về giá trị 0 thì nguyên nhân là do phương thức onMeasure chưa được call và chưa set setMeasureDimension().

onLayout

Phương thức này dùng để xác định vị trí định vị của View. Thông thường phương thức này thường xử dụng khi chúng ta muốn tạo một ViewGroup mới.

Lưu ý: Phương thức này cũng được gọi nhiều lần

onDraw

Rất đơn giản đây là phương thức vẽ của View. Trong Android mọi thứ đều được vẽ lên Canvas. Sau khi chạy xong phương thức này thì View chính thức được vẽ lên màn hình Android.

Nếu View có thuộc tính Visibility = GONE thì Android sẽ không thực hiện vẽ View đó.

Lưu ý: Phương thức này không được gọi nếu View đó là ViewGroup

requestLayout, invalidate, postInvalidate

Những phương thức này có tác dụng như thế nào và khi nào phải sử dụng nó

requestLayout

Khi bạn gọi phương thức này thì android thực hiện tính toán lại kích thước của View. Nghĩa là phải chạy vào phương thức onMeasure và đi xuống những phương thức khác để vẽ view.

Trường hợp chúng ta gọi method này khi khi chúng ta muốn thay đổi kích thước của View

invalide và postInvalidate

Khi gọi phương thức này thì Android sẽ gọi phương thức onDraw của View để tiến hành vẽ lại View.

Trường hợp chúng ta gọi phương thức này khi mà chúng ta muốn vẽ lại view chứ không thay đổi kích thức của View. Mình ví dụ như khi chúng ta setTextColor cho TextView thì trong phương thức setTextColor sẽ thực hiện gọi invalidate.

Vậy hai phương thức này khác gì nhau?

Hai phương thức này có cùng chức năng và trường hợp sử dụng như chỉ khác nhau ở chổ là nếu bạn muốn vẽ trong UI Thread hay Main Thread thì gọi invalidate còn nếu bạn muốn vẽ trong một Thread khác không phải là Main Thread thì phải gọi postInvalidate.

Các phương thức Touch trên View

Trên View cơ bản (Không phải ViewGroup) chúng ta có một phương thức touch trên view đó là phương thức onTouchEvent

Đối tượng MotionEvent giữ các thông tin về touch như vị trí x, y. action v.v

Hệ thống touch trên View khá là khó hiểu nên mình sẽ có một bài viết nói về nó. Trong bài viết này mình chỉ giới thiệu phương thức này thôi.

Ngoài ra nếu View là ViewGroup chúng ta có nhiều phương thức xử lý touch hơn nữa. Các bạn có thể tìm hiểm các phương thức

Ví dụ minh hoạ

Sau đây tôi sẽ tạo một class CustomView có nội dung như sau

Sau đó tôi addView này vào RelativeLayout trong Xml

Tiến hành run ứng dụng và xem log.

Các bạn thấy rằng onMeasure và onLayout được chạy khá nhiều lần

Tiếp tục xem tiếp log khi tôi touch và View.

Khi bạn remove view ra khỏi ViewGroup hay back Activity thì phương thức onDetachedFromWindows() được gọi.

Advertisements

Về haipro912
Đời rất dở nhưng anh vẫn phải niềm nở =))

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s

%d bloggers like this: