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

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. Authentication Overview

    Authentication Overview Service accounts User accounts API keys

  2. Java面向对象—抽象类和接口

    本文引用海子的一篇文章:http://www.cnblogs.com/dolphin0520/p/3811437.html 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法 ...

  3. CodeForces - 86D Powerful array (莫队)

    题意:查询的是区间内每个数出现次数的平方×该数值的和. 分析:虽然是道莫队裸体,但是姿势不对就会超时.答案可能爆int,所以要开long long 存答案.一开始的维护操作,我先在res里减掉了a[p ...

  4. Python3.x:日期库dateutil简介

    Python3.x:日期库dateutil简介 安装 pip install python-dateutil 关于parser #字符串可以很随意,可以用时间日期的英文单词,可以用横线.逗号.空格等做 ...

  5. jQuery动画二级下拉菜单

    在线演示 本地下载

  6. Linux中Nginx安装部署

    前言 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sys ...

  7. 通过Apache配置web服务器反向代理

    - 第一步: 到安装好的apache文件目录conf文件下,找到httpd.conf文件 找到如下配置,去掉#可以启动HTTP反向代理功能 : LoadModule proxy_module modu ...

  8. Go语言学习之运算符(The way to go)

    生命不止,继续go go go 今天介绍go中的运算符. 运算符大概分为: Arithmetic Operators Relational Operators Logical Operators Bi ...

  9. windows 下android react native详细安装配置过程

    写在前面: 在网上搜了很多安装配置文档,感觉没有一个真的跟我安装的过程一模一样的,东拼拼西凑凑,总算是装好了,我不会告诉你,断断续续,我花了两天时间...一到黑屏报错就傻眼,幸好在react群里遇到了 ...

  10. HDU 1532 --&&-- POJ1273 dinic 算法

    学长的代码#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> ...