网易新闻控件的创建,scrollView和viewGroup的学习,和up事件后模拟页面回到固定位置

1、viewGroup可以添加控件,也可以用<include layout="@layout/name">添加xml布局文件,在本次实验中将新闻的menu(scrollView布局文件)和正文(mainnews)加入到继承ViewGroup的控件中,但不明白为什么scrollview的宽度和下滑属性没了。导致不能下滑。

  一旦发现空间几部分组成就继承viewgroup ,然后重写onmeasure方法,在里面测量所有的孩子,然后重写layout方法布局这些孩子view的位置。

2了解了groupView的原理,并且根据源码模拟当离开屏幕时候屏幕回到主页面或者menu页面的过程。(其实menu文件里的textview和imageview可以合成一个textview的)

3注意viewgroup里在ontouchEvent 前面还有onInterceptTouchEvent,它默认的返回为false。其实触摸事件的传递是先通过activity的dispatchTouchEvent调用return super.dispatchTouchEvent(ev)往View里传递,通过view往view的子视图传递,若中途被父view拦截了下面的view就收到不到touch事件,子view收到后就继续回传给父view的onTouchEvent最后到activity的onTouchEvent(),因此若在view里拦截了事件,在activity的ontouchEvent是收不到事件的。以下两种情况:

事件->onInterceptTouchEvent返回true,就让自己的ontouhEvent来处理这个事件,下面的只收到Action_CAVCLE。若返回false就不拦截。

事件->onInterceptTouchEvent返回false ->命中view(收到MOVE和UP)如果我处理了事件(即ontouchEvent返回true)-则父view的onInterceptTouchEvent返回true,这样在activity里就收不到事件,否则返回false,传回activity里。

具体可以看:http://blog.csdn.net/xyz_lmn/article/details/12517911,文章下面的几张图画的很清楚。

下面直接看代码和注释学习:

public class MyViewGroup extends ViewGroup {
	private Context context;
	private int menuX;
	private Scroller mScroller;

	public MyViewGroup(Context context) {
		super(context);
		mScroller=new Scroller(getContext());
		this.context=context;
		// TODO Auto-generated constructor stub
	}

	public MyViewGroup(Context context, AttributeSet attrs) {
		super(context, attrs);this.context=context;
		mScroller=new Scroller(getContext());
		// TODO Auto-generated constructor stub
	}

	public MyViewGroup(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);this.context=context;
		mScroller=new Scroller(getContext());
	}

	int downx2;
		//这里可以拦截touch事件,viewgroup这里默认返回 的是false,导致后面的touchevent接收不到数据,
		@Override//这里可以拦截事件
	public boolean onInterceptTouchEvent(MotionEvent ev) {
			switch (ev.getAction()) {
			case MotionEvent.ACTION_DOWN:
				downx2=(int) ev.getX();
				break;
			case MotionEvent.ACTION_MOVE:
				int dis=(int) ev.getX()-downX;
				if(dis>10)
					return true;
				break;
			case MotionEvent.ACTION_UP:
				int dis2=(int) ev.getX()-downX;
				if(dis2<10)
					return false;
				break;
			default:
				break;
			}
			return true;

	}

		int downX;
		@Override
public boolean onTouchEvent(MotionEvent event) {
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				downX=(int) event.getX();
				break;
			case MotionEvent.ACTION_MOVE:
				int dis=(int) event.getX()-downX;
//				scrollTo(-240-dis, 0);
				if(dis>0)
				{
					int sx=(int)getScrollX();
					if(sx>-3*menuX/5)
						scrollBy(-dis, 0);
				}
				else{
					int sx=(int)getScrollX();;
					if(sx<0)
					scrollBy(-dis, 0);

					}
					downX=(int) event.getX();
				break;

			case MotionEvent.ACTION_UP:
				int sx=(int)getScrollX();

				//下面是不模拟直接回到固定位置,速度很快
//				if(sx>-3*menuX/10)
//					scrollTo(0, 0);
//				else
//					{
//					scrollTo(-menuX*3/5, 0);
//					end=-menuX*3/5;
//					}

				//下面计算模拟屏幕滑动到终止位置的偏移量,为正时向左划
				int end=0;
				if(sx>-3*menuX/10)
				{
				end=-sx;
				}
				else
					end=-3*menuX/5-sx;

//				这里可以利用scroller模拟屏幕滑动,最后个参数是up事件后屏幕话当到稳定点的时间
				/*
				 * 4个参数非别为x、y的起始量和偏移量
				 */
				mScroller.startScroll(sx, 0, end, 0, Math.abs(end)*10);
//					while(mScroller.computeScrollOffset())
//					{
//						int currtX=mScroller.getCurrX();//通过打印x值就清楚屏幕如何滑动的
//						System.out.println(currtX);
//					}

				//如果在模拟时候采用刷新后,它也会去画它的孩子,然后计算偏移量,若计算偏移量的时候再递归调用刷新,直到固定位置停止刷新,就可以让屏幕跟随模拟的运动达到控制手离开屏幕后的                                // 移动速度了
				invalidate();//刷新操作invalidate->drawchlid->chid.draw->computscroll这几个步骤来更新这个view的,因此我们通过覆写computscroll,
//							

				break;
			default:
				break;
			}
			return true;
		}
		//覆写computeScroll方法,在方法里继续调用invalidate,这样循环偏移计算,就可以模拟和控制手离开屏幕后窗口移动的操作
		@Override
		public void computeScroll() {
				super.computeScroll();
				if(mScroller.computeScrollOffset())
				{
					int cx=mScroller.getCurrX();
					scrollTo(cx, 0);
					invalidate();
				}

			}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);

		View menu=getChildAt(0);
		menu.measure(widthMeasureSpec, heightMeasureSpec);
		View news=getChildAt(1);
		news.measure(widthMeasureSpec, heightMeasureSpec);

	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {

		View menu=getChildAt(0);
		menuX=menu.getMeasuredWidth();
		menu.layout(-3*menuX/5, t, 0, b);
		View news=getChildAt(1);
		news.layout(l, t, r, b);
	}

}

  

activity.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"
    tools:context="com.example.buju.MainActivity$PlaceholderFragment" >

    <com.example.buju.MyViewGroup.MyViewGroup
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">
         <!-- 添加菜单 -->
        <include layout="@layout/menu" />
        <!-- 新闻主界面 -->
     <include layout="@layout/maninew"/>      

</com.example.buju.MyViewGroup.MyViewGroup>
</RelativeLayout>

  

menu.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="240dp"
    android:layout_height="wrap_content"
   >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="980dp"
        android:orientation="vertical"
         android:background="@drawable/menu_bg"
         >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:orientation="horizontal"
            >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="60dp"
                android:background="@drawable/tab_news"
                android:paddingBottom="10dp"
                android:paddingLeft="5dp"
                android:paddingTop="10dp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:paddingTop="20dp"
                android:text="新闻条目2"
                android:textSize="20dp"
                android:textColor="@android:color/white"
                />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="@drawable/menu_bg"
            android:orientation="horizontal" >

            <ImageView
                style="@style/menuimagestyle"
                android:background="@drawable/tab_news" />

            <TextView
                style="@style/menutextstyle"
                android:text="新闻条目3" />
        </LinearLayout>

         <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目4"
              />
        </LinearLayout>

         <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目5"
              />
        </LinearLayout>

          <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目6"
              />
        </LinearLayout>

           <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目7"
              />
        </LinearLayout>

            <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目8"
              />
        </LinearLayout>

             <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目9"
              />
        </LinearLayout>

              <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目10"
              />
        </LinearLayout>

               <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目11"
              />
        </LinearLayout>

                <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目12"
              />
        </LinearLayout>

                 <LinearLayout
             android:layout_width="match_parent"
        	 android:layout_height="60dp"
        	 android:background="@drawable/menu_bg"
        	 android:orientation="horizontal"
        >
		<ImageView
		    style="@style/menuimagestyle"
		    android:background="@drawable/tab_news"
		    />
          <TextView
             style="@style/menutextstyle"
		     android:text="新闻条目13"

              />
        </LinearLayout>

    </LinearLayout>

</ScrollView>

  2、mainnews.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/title1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@drawable/top_bar_bg">

 <ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/main_back"
    android:id="@+id/back"
    />   

 <ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/top_bar_divider"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp"
    android:layout_toRightOf="@id/back"
    />

 <TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_marginBottom="25dp"
     android:layout_marginTop="25dp"
     android:layout_marginLeft="30dp"
     android:gravity="center_vertical"
     android:text="网易新闻"
     android:textColor="@android:color/white"
     android:textSize="30dp" />

    </LinearLayout>

    <TextView
        android:layout_below="@id/title1"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:text="钓鱼岛是中国额,老谭是世界的!"
       android:gravity="center"
        />

</RelativeLayout>

  

时间: 2024-12-12 08:56:15

网易新闻控件的创建,scrollView和viewGroup的学习,和up事件后模拟页面回到固定位置的相关文章

Swift学习之函数和简单地控件的创建

 今天还是重复昨天做的事情--敲代码,但唯一的不同就是所学的知识不同了,我们又进一步往深得层次学习了,感觉越来越有意思了,虽然临近结束了看着大家积极性越来越低了,但是我知道我不能这样,我要比别人付出的更多,更加的踏实才行,因为我知道我的基础不如别人,目标和动力也和他们不同,看着大家有的说是只要找到工作就好,还有的说只要每个月够花就好,担着真的是大家来这里学习的最终目的吗,如果是这样,真的还不如随便找个工作将就一下,也比这个整天做到这好多了,还交了那么贵得费用,所以何必呢,既然选择了这条路,既然当

第三章 按钮控件的创建

一.前言 不知不觉一晃两个月过去,说来惭愧,在此期间alterto一直没有再研究DuiEngine.主要是因为DuiEngine的作者现在构建一个新的界面库soui,而笔者也一直处于观望状态,因为DuiEngine的作者说了以后可能就不维护DuiEngine了,要把主要的经历放在SOUI上.alterto顿时犹豫了,既然这样我还为DuiEngine做什么教程啊.于是这两个月的时间里一直都很犹豫,也没有再出DuiEngine相关的教程.现在看来这种焦躁对于一个优秀的程序猿来说着实不应该,这也正暴露

win32 控件的创建和消息响应

1. 控件的创建 控件的创建和窗口创建是一样的,例如: //-------- 创建窗口或控件 ----hwnd = CreateWindow("button","myButton01", WS_VISIBLE|WS_CHILD, 80,60,35,25, hWnd,(HMENU)IDB_BUTTON01,hInst,NULL); 是一个按钮的创建,其中hWnd是窗口句柄,hInst是应用程序句柄. 其他控件类似的可以把第一个参数"button"改

事件委托应用:在父控件中创建子控件,并接收值

传值过程使用委托方法 定义一个打开按扭,一个文本框 1 /// <summary> 2 /// 增加父控件 3 /// </summary> 4 public void AddParent(BaseControl ctl) 5 { 6 foreach (Control ct2 in this.Parent.Controls) 7 { 8 if (ct2.Name == ctl.Name) { 9 ct2.Focus(); 10 return; 11 } 12 } 13 ctl.Wi

swift基础控件的创建

/* let apples = 3 let orange = 5 let L = 1.1 let appleSummary = "I have \(apples) apples" let fruitSummary = "I have \(apples + orange) pieces of fruit." let isay = "I Love \(L) you " print(isay) let expliciFloat: Float = 4 /

BMDThread控件动态创建多线程示例

http://www.cnblogs.com/railgunman/archive/2010/12/08/1900688.html BMDThread控件是一套相当成熟的线程控件,使用它可以让你快速的创建.管理线程.    可以到CSDN或者盒子上下载BMDThread控件.    下面我们用多线程模拟客户端发送文件的例子来简单认识一下它.    在窗体中放置一个TIDClient,TBMDThread,TBMDThreadGroup.三个TEdit,两个按钮(开始线程,结束线程),一个MEMO

树控件CTreeCtrl 创建与双击响应

函数功能:创建一个树控件,并实现双击节点响应事件. 响应方法:在树控件上增加双击响应事件. 代码: 1.在OnInitDialog中:   CTreeCtrl *ctreectrl = (CTreeCtrl *)GetDlgItem(IDC_TREE1);  //调用ModifyStyle方法修改数控件Sytle  ctreectrl->ModifyStyle(0,TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);  //设置树控件字体颜色  ct

Android--根据子控件的大小自动换行的ViewGroup

1.自定义ViewGroup 1 /** 2 * Created by Administrator on 2016/2/26. 3 * 4 * --------自动换行的ViewGroup----------- 5 */ 6 public class LineWrapLayout extends ViewGroup { 7 private static final boolean DEBUG = true; 8 private static final String TAG = "AutoLin

关于内存控件TdxMemData的编程设计思路_学习

TdxMemData控件可以把DataSet数据库保存在内存中,并显示在TdxDBGrid上,而通过dxmdt1.FieldByName('字段').value得到当前光标所在值.通过while遍历 整个数据集中的值.如此可以在内存中先操作数据然后再用sql语句提交到数据库, 通常对一条记录都有增删改的操作,内部的操作可以这样实现:增删改按钮下只是操作内存中的数据,当真正保存按钮时才提交到数据库.方便数据的处理. TdxMemData应用示例代码: unit Unit1; interface u