6

Tôi đang cố gắng thêm phản hồi chạm vào LinearLayout tương tự như phản hồi của Nút thông thường ở cấp API 21, giống như ví dụ this và cho đến nay không thành công.Hiệu ứng Ripple Android + Độ cao trên các lần xem không phải nút

tôi đã xác định đối tượng vẽ được gợn tiêu chuẩn như thế này:

<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
android:color="?android:colorControlHighlight"> 

<item android:id="@android:id/mask"> 
    <shape android:shape="rectangle"> 
     <solid android:color="?android:colorAccent" /> 
    </shape> 
</item> 

và sử dụng StateListAnimator mà Google cung cấp here:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_enabled="true" android:state_pressed="true"> 
    <objectAnimator 
     android:duration="@android:integer/config_shortAnimTime" 
     android:propertyName="translationZ" 
     android:valueTo="@dimen/touch_raise" 
     android:valueType="floatType" /> 
</item> 
<item> 
    <objectAnimator 
     android:duration="@android:integer/config_shortAnimTime" 
     android:propertyName="translationZ" 
     android:valueTo="0dp" 
     android:valueType="floatType" /> 
</item> 

Sau khi xác định làm phim hoạt hình và gợn drawable, tôi đã thêm chúng vào Li của tôi nearLayout như vậy:

<LinearLayout 
    android:id="@+id/linearLayout"   
    android:clickable="true" 
    android:focusable="true" 
    android:orientation="horizontal" 
    android:background="@drawable/ripple" 
    android:stateListAnimator="@anim/touch_elevation"> 

Ý tưởng là để sử dụng LinearLayout này như một nút, vì nó là đơn giản hơn nhiều cho tôi để chèn nhiều loại hình văn bản và xử lý vị trí ImageView bên trong nó (như trái ngược với drawables nút).

Thêm hiệu ứng gợn hoặc hoạt ảnh riêng biệt hoạt động, miễn là nền của chế độ xem không có độ trong suốt theo câu hỏi this.

Tôi không chắc liệu đây có phải là vấn đề liên quan đến câu hỏi được đề cập ở trên hay không, nhưng nhìn thấy nút tiêu chuẩn quản lý để sử dụng cả phản hồi hoạt ảnh và độ cao, tôi thấy rằng có thể đạt được hiệu ứng này trên các chế độ xem khác.

Bất kỳ thông tin chi tiết nào về vấn đề này sẽ được đánh giá rất nhiều.

+0

Nếu bạn đang mong đợi hiệu ứng gợn sóng được áp dụng khi người dùng nhấn vào 'LinearLayout', bạn cần sử dụng' StateListDrawable' thích hợp, không trực tiếp tham chiếu đến ''. – CommonsWare

+0

Vui lòng xây dựng – Rakatan

+0

Nền hiện tại của bạn cho biết "hiển thị gợn ngay lập tức". Điều đó có vẻ giống như một sự lựa chọn tò mò. Nền của một 'Nút' là một' StateListDrawable', để sử dụng các hình ảnh khác nhau cho bình thường, được nhấn, bị vô hiệu hóa, tập trung, vv Bạn sẽ cần phải làm điều tương tự. – CommonsWare

Trả lời

0

Cả hai hiệu ứng làm việc togheter mà không android:id="@android:id/mask" thuộc tính trong phần tử mục của gợn (có thể thuộc tính này cho biết thêm một số tính minh bạch).

+0

Thực tế cả hai tác dụng đều hoạt động cùng nhau mà không có mặt nạ. Rõ ràng là cùng một vấn đề minh bạch sau đó. Tôi xin lỗi nhưng tôi không thể sử dụng giải pháp của bạn, vì tôi đang tìm cách áp dụng cả hai hiệu ứng trên bất kỳ mục nào. Sử dụng giải pháp này trên một CardView ví dụ (nơi mà các gợn phải là tiền cảnh), làm cho toàn bộ nội dung của khung nhìn vô hình. – Rakatan

0

Sử dụng ForegroundLinearLayout. Nó cho phép để đặt gợn hoặc bất kỳ khác drawable trong foreground của xem. Giống như cách bạn có thể tạo ForegroundRelativeLayout v.v. (chỉ cần tạo lớp này mở rộng từ RelativeLayout).

Dưới đây là ví dụ với stateListAnimator và gợn drawable của bạn:

<your.package.ForegroundLinearLayout 
    android:layout_width="300dp" 
    android:layout_height="300dp" 
    android:layout_centerInParent="true" 
    android:gravity="center" 
    android:foreground="@drawable/bg_ripple" 
    android:background="#fff" 
    android:clickable="true" 
    android:stateListAnimator="@animator/animator_elevation"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello world!"/> 

</your.package.ForegroundLinearLayout> 

Kết quả:

enter image description here

EDIT: ForegroundLinearLayout tồn tại trong thư viện thiết kế hỗ trợ. Vì vậy, bạn chỉ có thể sử dụng android.support.design.internal.ForegroundLinearLayout

Các vấn đề liên quan