2017-04-12 125 views
2

我遇到問題。Android:clipChildren = false和onClickListner用於修剪兒童

我們有佈局定製框架佈局,縮放和平移功能

public class MyFrameLayout extends FrameLayout { 
... 
@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    getChildAt(0).setTranslationX(vTranslate.x); 
    getChildAt(0).setTranslationY(vTranslate.y); 
    getChildAt(0).setScaleX(mScale.scaleFactor); 
    getChildAt(0).setScaleY(mScale.scaleFactor); 
} 

類偵聽觸摸手勢和翻譯/擴展自己的孩子。 我用它作爲ViewGroup內容的父視圖組。

<MyFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/gray" 
android:clipChildren="false"> 

<android.support.constraint.ConstraintLayout 
    android:id="@+id/calc_constraint_layout" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:clipChildren="false"/> 

內容約束佈局programmaticaly增加,這是更大然後屏幕或父組。正因爲如此,我們設置了clipChildren = false。 但是,在轉換之前出界的孩子不會對onClick事件做出迴應。

一些照片:

開始屏幕enter image description here

翻譯後: enter image description here

6%的節點只是不回答點擊。 請幫幫我。

地址: enter image description here

+0

那麼'MyFrameLayout'和'ConstraintLayout'的寬度是多少? – pskink

+0

@pskink它是match_parent。如果我爲約束佈局設置寬度爲2000dp(白色) - 容器將變大並點擊工作。不知道,爲什麼match_parent和wrap_content都不適用於約束佈局。它仍然具有「屏幕大小」 – Kotsu

+0

所以你可以看到事件傳遞給子視圖,如果event(x,y)位置在父級內部 - 如果它位於父級之外,則簡單地忽略它們 - 可能不是「 setTranslation *'方法你可以嘗試'scrollTo' /'scrollBy' - 我不知道它如何與'setScale *'一起工作... – pskink

回答

0

嘛。我無法找到約束佈局(白色)以適應wrap_content值的內容。我的解決方法是動態增加約束佈局的寬度和高度,從而相應地增加節點樹的寬度和高度。

當你添加額外的節點 - 佈局度量增長,你看它如何調整abit。然後爲了解決這個問題,我不得不在父級佈局中重寫onLayout()方法(它在屏幕截圖上是綠色的,但它是自定義的ZoomableLayout)。

現在一切正常。但我不確定這個實現是否醜陋。