下面来简单实现一下网易新闻客户端左右切换的效果,当然实际项目上肯定不能这样写,还有很多需要优化的地方。

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@android:id/tabhost"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent" >
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:orientation="vertical" >
  10. <TabWidget
  11. android:id="@android:id/tabs"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:orientation="horizontal" />
  15. <FrameLayout
  16. android:id="@android:id/tabcontent"
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent"/>
  19. <!--   <FrameLayout
  20. android:id="@+id/real_tabcontent"
  21. android:layout_width="match_parent"
  22. android:layout_height="0dp"
  23. android:layout_weight="0"/> -->
  24. </LinearLayout>
  25. </TabHost>
Java实现逻辑
package com.jackie.neteasedemo;

import android.os.Bundle;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.ImageView;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;

public class MainActivity extends Activity {

	private TabHost mTabHost;
	private Fragment mFragment;

	private float startX = 0;
	private float endX = 0;
	private int touchSlop;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mTabHost = (TabHost) findViewById(android.R.id.tabhost);
		mTabHost.setup();
		mTabHost.setOnTabChangedListener(new OnTabChangeListener() {

			@Override
			public void onTabChanged(String tabId) {
				System.out.println("current tabid=" + tabId);
				FragmentTransaction ft = getFragmentManager()
						.beginTransaction();
				if (TextUtils.equals("first", tabId)) {
					// add/replace fragment first
					mFragment = new Fragment1();
					System.out.println("Load Frament1");
				} else if (TextUtils.equals("second", tabId)) {
					// add/replace fragment second
					mFragment = new Fragment2();
					System.out.println("Load Frament2");
				} else if (TextUtils.equals("third", tabId)) {
					// add/replace fragment third
					mFragment = new Fragment3();
					System.out.println("Load Frament3");
				}
				ft.replace(android.R.id.tabcontent, mFragment);
				ft.commit();
			}
		});

		mTabHost.addTab(mTabHost.newTabSpec("first").setIndicator("First")
				.setContent(new DummyTabFactory(this)));
		mTabHost.addTab(mTabHost.newTabSpec("second").setIndicator("Second")
				.setContent(new DummyTabFactory(this)));
		mTabHost.addTab(mTabHost.newTabSpec("third").setIndicator("Third")
				.setContent(new DummyTabFactory(this)));

		touchSlop = ViewConfiguration.get(this).getScaledTouchSlop(); //默认是8,能够根据不同分辨率适配而改变
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			startX = event.getX();
			break;
		case MotionEvent.ACTION_UP:
			endX = event.getX();
			break;
		default:
			break;
		}

		if (endX - startX > touchSlop) { // 向右滑动
			if (TextUtils.equals(mTabHost.getCurrentTabTag(), "third")) {
				mFragment = new Fragment2();
				mTabHost.setCurrentTabByTag("second");
			} else if (TextUtils.equals(mTabHost.getCurrentTabTag(), "second")) {
				mFragment = new Fragment1();
				mTabHost.setCurrentTabByTag("first");
			}

			FragmentTransaction ft = getFragmentManager().beginTransaction();
			ft.replace(android.R.id.tabcontent, mFragment);
			ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
			ft.commit();
		} else if (Math.abs(endX - startX) > touchSlop) { // 向左滑动
			if (TextUtils.equals(mTabHost.getCurrentTabTag(), "first")) {
				mFragment = new Fragment2();
				mTabHost.setCurrentTabByTag("second");
			} else if (TextUtils.equals(mTabHost.getCurrentTabTag(), "second")) {
				mFragment = new Fragment3();
				mTabHost.setCurrentTabByTag("third");
			}

			FragmentTransaction ft = getFragmentManager().beginTransaction();
			ft.replace(android.R.id.tabcontent, mFragment);
			ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
			ft.commit();
		}
		return super.onTouchEvent(event);
	}

	private class DummyTabFactory implements TabHost.TabContentFactory {
		private Context context;

		public DummyTabFactory(Context ctx) {
			this.context = ctx;
		}

		@Override
		public View createTabContent(String tag) {// 创建宽高均为0的view
			View v = new ImageView(context);
			v.setMinimumWidth(0);
			v.setMinimumHeight(0);
			return v;
		}
	}
}

效果如下:




Android实现网易新闻客户端效果的更多相关文章

  1. Android SlidingMenu 仿网易新闻客户端布局

    前面两篇文章中的SlidingMenu都出现在左侧,今天来模仿一下网易新闻客户端左右两边都有SlidingMenu的效果,以下是网易新闻客户端效果: 不扯闲话了,直接进入正题吧 frame_conte ...

  2. 类似掌盟的Tab页 Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签 (转)

    原博客地址  :http://blog.csdn.net/xiaanming/article/details/10766053 本文转载,记录学习用,如有需要,请到原作者网站查看(上面这个网址) 之前 ...

  3. Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9971721 大家都知道Android的ActionBar是在3.0以上才有的,那么在3 ...

  4. Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...

  5. Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了能更好的分享高质量的文章,所以开设了此专栏.文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码.该专栏 ...

  6. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherlock ...

  7. ActionBar+DrawerLayout实现网易新闻客户端首页

    一.概述 随着android版本的不断的更新,google推出了越来越多的高级组件,采用这些官方组件我们可以方便的实现一些以前需要通过复杂编码或者使用第三方组件才能实现的效果,比如slidingmen ...

  8. IOS 类似网易新闻客户端内容滚动菜单跟随居中组件

    需求分析: 1.类似网易新闻客户端页面滚动组件.菜单栏对应菜单项一直居中 2.点击菜单栏可以切换到对应的page 3.滑动页面可以自动切换相应的菜单.并且对应的菜单栏居中显示 4.初始化时可以自定义菜 ...

  9. 分享一个仿网易新闻客户端iPhone版的标签式导航ViewController

    该Controller是一个容器,用于容纳其他的controller.效果与网易新闻客户端的标签式导航基本一样: (1)点击上面的标签,可以切换到对应的controller,标签下面的红色提示条的长度 ...

随机推荐

  1. day3-python-文件操作(2)

    本文内容涉及python中的os模块和os.path模块的常用操作,这两个模块提供了与平台和操作系统无关的文件系统访问方法.os模块负责大部分的文件系统操作,包括:删除文件.重命名文件.遍历目录树等: ...

  2. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 本文部分内容引用自OneAPM:http://blog.oneapm.com/apm-tech/226.html 引入Lambda Java 是一流的面向对象语言 ...

  3. Spark1.x和2.x如何读取和写入csv文件

    看很多资料,很少有讲怎么去操作读写csv文件的,我也查了一些.很多博客都是很老的方法,还有好多转来转去的,复制粘贴都不能看.下面我在这里归纳一下,以免以后用到时再费时间去查.前端实现文件下载和拖拽上传 ...

  4. Oracle数据库的删除

    在Windows中彻底删除原先的Oracle,然后再重新安装Oracle数据库.具体步骤如下:   1. 开始->设置->控制面板->管理工具->服务,停止所有Oracle服务 ...

  5. Mybatis导入原生配置文件

    在Spring-Mybatis中导入Mybatis原生配置文件 在sqlSessionFactory Bean中设置设置configLocation属性 <property name=" ...

  6. 初入Spring-boot(一)

    一.利用eclipse快速创建Spring-boot项目 1.首先去http://start.spring.io网站,勾选所需要的starter,如图: 选择完之后下载该文件,打开后发现是一个正常的m ...

  7. hive 数据清理--数据去重

    hive> select * from (select *,row_number() over (partition by id) num from t_link) t where t.num= ...

  8. coredata 数据库升级

    在真实开发中,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模的重构:所以数据的迁移就显得尤为重要了. CoreData 中,数据迁移本质就是把旧的 SQLi ...

  9. spring3: AOP 之 通知顺序

    如果我们有多个通知想要在同一连接点执行,那执行顺序如何确定呢?Spring AOP使用AspectJ的优先级规则来确定通知执行顺序.总共有两种情况:同一切面中通知执行顺序.不同切面中的通知执行顺序. ...

  10. SPOJ - VLATTICE

    链接 题意:三维平面,找从(0,0,0)看(n,n,n)能看到的点 题解:很明显就是求gcd(i,j,k)==1的(i,j,k)对数,改一下公式即可,记得要算平行坐标轴的三个平面,还有含0的三个坐标 ...