Android View中 layout 的使用

1、layout简介  

给View 以及其它的所有的子节点都分配了一个尺寸;
这也是布局的第二个步骤,(第一个步骤是measuing).在这一个步骤中,每一个每一个父节点都会回调layout.This is typically done using the child measurements
 that were stored in the measure pass()

继承的子类不应当overide这个方法。而是应当继承onlayout这个方法.在这个onlayout这个方法中,他们应当嗲用layout方法,遍历每一个子节点的布局。
(我们可以查看AbsoluteLayout 的code)

2、layout用法一:

 其,在ScrollView中,对layout使用的思想是比较ok的。

**
 * @blog http://blog.csdn.net/xiaanming
 * 
 * @author xiaanming
 *
 */
public class MTActivity extends Activity implements OnScrollListener{
	/**
	 * 自定义的MyScrollView
	 */
	private MTScrollView myScrollView;
	/**
	 * 在MyScrollView里面的购买布局
	 */
	private LinearLayout mBuyLayout;
	/**
	 * 位于顶部的购买布局
	 */
	private LinearLayout mTopBuyLayout;
	

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.mt_activity_main);
		
		myScrollView = (MTScrollView) findViewById(R.id.scrollView);
		mBuyLayout = (LinearLayout) findViewById(R.id.buy);
		mTopBuyLayout = (LinearLayout) findViewById(R.id.top_buy_layout);
		
		myScrollView.setOnScrollListener(this);
//		mTopBuyLayout.setV
		//当布局的状态或者控件的可见性发生改变回调的接口
//		当界面初始化的时候,就对界面上的可移动的买的布局 进行一移动到指定的位置
		findViewById(R.id.parent_layout).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			
			@Override
			public void onGlobalLayout() {
				//这一步很重要,使得上面的购买布局和下面的购买布局重合
				System.out.println("onGlobalLayout"+myScrollView.getScrollY());
				onScroll(myScrollView.getScrollY());
				
//				System.out.println(myScrollView.getScrollY());
			}
		});
	}



	/**
	 * 将那个买的在fragment中 可以移动的那个买的布局,
	 *  不停的移动那个布局,当可移动的那个布局到达了顶部的时候, 就不在移动那个可以移动的布局
	 *  
	 *  
	 *  
	 */
	@Override
	public void onScroll(int scrollY) {
		int mBuyLayout2ParentTop = Math.max(scrollY, mBuyLayout.getTop());
		System.out.println("mBuyLayout2ParentTop "+mBuyLayout2ParentTop);
		mTopBuyLayout.layout(0, mBuyLayout2ParentTop, mTopBuyLayout.getWidth(), mBuyLayout2ParentTop + mTopBuyLayout.getHeight());
	}



}


/**
 * @blog http://blog.csdn.net/xiaanming
 * 
 * @author xiaanming
 *
 */
public class MTScrollView extends ScrollView{
	private OnScrollListener onScrollListener;


	public MTScrollView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public MTScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	public MTScrollView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 设置滚动接口
	 * @param onScrollListener
	 */
	public void setOnScrollListener(OnScrollListener onScrollListener) {
		this.onScrollListener = onScrollListener;
	}
	

	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		super.onScrollChanged(l, t, oldl, oldt);
		if(onScrollListener != null){
			System.out.println("onScrollChanged");
			onScrollListener.onScroll(t);
		}
	}
	
	/**
	 * 
	 * 滚动的回调接口
	 * 
	 * @author xiaanming
	 *
	 */
public interface OnScrollListener{
	/**
	 * 回调方法, 返回MyScrollView滑动的Y方向距离
	 * @param scrollY
	 * 				、
	 */
	public void onScroll(int scrollY);
}

}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent_layout"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="45dip"
        android:scaleType="centerCrop"
        android:src="@drawable/navigation_bar" />

    <com.ownku.view.MTScrollView
        android:id="@+id/scrollView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >

                <ImageView
                    android:id="@+id/iamge"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/pic"
                    android:scaleType="centerCrop" />

                <include
                    android:id="@+id/buy"
                    layout="@layout/buy_layout" />

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/one"
                    android:scaleType="centerCrop" />

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/one"
                    android:scaleType="centerCrop" />

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/one"
                    android:scaleType="centerCrop" />
            </LinearLayout>

            <include
                android:id="@+id/top_buy_layout"
                layout="@layout/buy_layout" />
        </FrameLayout>
    </com.ownku.view.MTScrollView>

</LinearLayout>

当买东西的那个布局移动开始保持在布局中的 buy_layout的布局离顶部的高度保持一致,以达到对其在LinearLayout时,其中buy_layout可见时候,对其的覆盖,当其移动走,不可见的时候。 top_buy_layout就停留在其顶部,通过layout数的变化。



3、layout用法三

其中的,layout的移动是相对于父类给子类提供的空间进行移动的。

   




点击上面的button 对img 进行移动,图上的移动是相对于图片所在父类的空间进行的移动。


ImageView img;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		img=(ImageView) findViewById(R.id.imageView1);
		findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
//				animation2();
				lay1();
				
			}
		});
	}

	protected void lay1() {
		// TODO Auto-generated method stub
		/**
		 * 是相对于改view 所在的父类的布局,所发生的变化的位移
		 * 
		 */
		img.layout(100	, 100, 310, 150);
			
		
	}

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    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" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <LinearLayout
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerInParent="true"
        android:background="@android:color/darker_gray" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher" />
    </LinearLayout>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:text="Button" />

</RelativeLayout>



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值