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

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. Python+Django+Bootstrap 框架环境搭建

    1.安装python和pip(python.pip安装自行百度,pip是一个安装和管理 Python 包的工具) 2.配置python环境变量(python和scripts目录都需要配置) 3.安装D ...

  2. Python之初识函数(Day11)

    一.函数的定义与调用 总结一: 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开... ...

  3. C#驱动级模拟按键操作

    C#驱动级模拟按键操作 2013-09-26 03:17 ·AB叔 447 3 <- 点击左侧的数字“攒”一个吧 昨天遇到一个程序自动输入财付通密码的任务. 因为财付通密码控件是有安全保护的,所 ...

  4. Codeforces Round #475 (Div. 2)

    B. Messages 题意:有n个消息分别在ti的时候收到.设所有消息收到时初始值为A,每过一秒,其值减去B.当在某一秒选择读某个消息时,获值为当前消息的值:如果在某一秒结束的时候,手上有k则消息未 ...

  5. zoj2432

    /* 首先,dp的最开始是定义状态 dp[i][j] 表示A串的前i个,与B串的前j个,并以B[j]为结尾的LCIS 的长度. 状态转移方程: if(A[i]==B[j]) dp[i][j]=max( ...

  6. SVN使用—工作模式及运行原理以及优缺点对比

    一.SVN原理 (1)运行方式 svn服务器有2种运行方式:独立服务器和借助apache运行. 1.独立服务器访问 访问地址如:svn://svn.test.com/test 2.借助Apache等h ...

  7. java类执行顺序

    1. 静态初始化块 > 初始化块 > 构造器 2. 父类 > 子类 综合下来顺序就是: 父类静态初始化块和静态成员变量 子类静态初始化块和静态成员变量 父类初始化块和普通成员变量 父 ...

  8. 20145219 《Java程序设计》实验一 Java开发环境的熟悉(Linux + Eclipse)实验报告

    20145219 <Java程序设计>实验一 Java开发环境的熟悉(Windws + IDEA)实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA 编辑. ...

  9. 添加一个vue全局守卫,主要用于用户登录时候验证

    //注册一个全局守卫,作用是在路由跳转钱,对路由进行判断,防止未登录用户跳转到其他页面 router.beforeEach((to, from, next) => { let token = l ...

  10. shell编程学习笔记之标准输入输出(read&echo)

    2017-07-17 09:32:07 输入read: 用途: 从标准输入读取一行,或者从文件描述符FD(file descriptor)中读取一行,并且将其分割成字段. 用法: read [-ers ...