Android FrameLayout和动态剪辑

时间:2014-04-01 17:40:07

标签: android android-layout android-framelayout

我有一个包含2个其他FrameLayouts的FrameLayout。我希望其中一个内部FrameLayouts永远不会剪辑,我希望其他内部FrameLayout(包含一个位于FrameLayout中心的ImageView)根据用户操作剪辑或不剪辑。我最感兴趣的情况是Image大于包含它的FrameLayout。

如果我在包含的布局上执行setClipChildren(false)或setClipChildren(true),那么所有内容都会根据值进行剪辑或不剪辑。

如果我对内部FrameLayout上的包含FrameLayout和setClipChildren(true)执行setClipChildren(false),则不会剪切添加到内部FrameLayout的ImageView。从父布局剪辑子状态是否传播到子布局?

我在内部FrameLayout中尝试了CLIP_HORIZONTAL,CLIP_VERTICAL以及FILL_HORIZONTAL,FILL_VERTICAL。

我试图避免使用setClipBounds(),因为大小可以改变,我希望FrameLayout能够根据Gravity.CENTER和剪辑子状态找出正确的大小。有没有办法让Android为我做剪辑?否则,我必须计算大小,移动边距并设置剪辑边界。这似乎是Android应该处理的东西。

Diagram

FrameLayout 1永远不应该剪辑。 FrameLayout 2应根据应用程序可用的其他信息剪辑或不剪辑ImageView。

以下是测试应用的布局xml和代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/FrameLayoutMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<FrameLayout
    android:id="@+id/FrameLayoutClip"
    android:layout_width="84dp"
    android:layout_height="65dp"
    android:layout_marginLeft="12dp"
    android:layout_marginTop="12dp"
    android:background="@color/backgroundColor"
    android:clipChildren="false"
    android:clipToPadding="false" >

    <CheckBox
        android:id="@+id/checkBoxClipMain"
        android:layout_width="140dp"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:text="Clip - Main" />

    <CheckBox
        android:id="@+id/checkBoxClipChild"
        android:layout_width="140dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:maxLines="1"
        android:text="Clip - Child" />

</FrameLayout>

<FrameLayout
    android:id="@+id/FrameLayoutText"
    android:layout_width="200dp"
    android:layout_height="130dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="100dp"
    android:background="@color/backgroundColor"
    android:clipChildren="false"
    android:clipToPadding="false" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="300dp"
        android:layout_height="180dp"
        android:text="Large Text to fill up a text view so that we can test how clipping occurs with TextViews and FrameLayouts.  It looks like this will be long enough."
        android:textAppearance="?android:attr/textAppearanceLarge" />
</FrameLayout>

<FrameLayout
    android:id="@+id/FrameLayoutImage"
    android:layout_width="50dp"
    android:layout_height="50dp" 
    android:layout_marginTop="200dp"
    android:layout_marginLeft="600dp"
    android:clipChildren="false"
    android:clipToPadding="false" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="200px"
        android:layout_height="200px"
        android:layout_gravity="center"
        android:src="@drawable/test_image" />
</FrameLayout>

public class MainActivity extends Activity implements OnCheckedChangeListener {

private static final String TAG = "MainActivity";
private CheckBox _mainCheckBox = null;
private CheckBox _childCheckBox = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewGroup tempViewGroup = (ViewGroup)findViewById(R.id.FrameLayoutMain);
    tempViewGroup.setClipChildren(false);
    tempViewGroup = (ViewGroup)findViewById(R.id.FrameLayoutClip);
    tempViewGroup.setClipChildren(false);

    _mainCheckBox = (CheckBox)findViewById(R.id.checkBoxClipMain);
    _mainCheckBox.setOnCheckedChangeListener(this);
    _mainCheckBox.setChecked(false);

    _childCheckBox = (CheckBox)findViewById(R.id.checkBoxClipChild);
    _childCheckBox.setOnCheckedChangeListener(this);
    _childCheckBox.setChecked(false);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1)
{
  ViewGroup mainViewGroup = (ViewGroup)findViewById(R.id.FrameLayoutMain);
  if (arg0 == _childCheckBox)
  {
     ViewGroup tempViewGroup = (ViewGroup)findViewById(R.id.FrameLayoutText);
     Log.d(TAG, "child onCheckChanged is " + arg1);
     tempViewGroup.setClipChildren(arg1);
     tempViewGroup = (ViewGroup)findViewById(R.id.FrameLayoutImage);
     tempViewGroup.setClipChildren(arg1);
  }
  else if (arg0 == _mainCheckBox)
  {
     Log.d(TAG, "main onCheckChanged is " + arg1);
     mainViewGroup.setClipChildren(arg1);
  }
  mainViewGroup.invalidate();
}

}

0 个答案:

没有答案