基于Android的计步器(Pedometer)的讲解(五)——跟随界面滑动的指示器

计步器(Pedometer)整个项目的源代码,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~)

https://github.com/296777513/pedometer

今天,说下指示器随着界面滑动,可能这样说不太直观,我先附上几张效果图:

如图所示,中间部分为一个ViewPager(可以滑动的页面),大家可以看到屏幕的顶部,字体下面有一个指示器,

当页面向右滑动时,指示器也会随着界面动态的向右滑动,当页面停在第二个页面时,字体也会变为蓝色。

下来给大家贴出主要的代码:

package com.example.histogram;

import java.util.ArrayList;
import java.util.List;
import com.example.changepage1.R;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;

/**
 * 这是记步的碎片 Author: 李垭超
 * email:[email protected] Date: 2015-1-8 Time: 下午6:39
 */
public class FragmentPK extends Fragment {
	private View view;
	private int currentPage1_2;// 这是屏幕的一般
	private ImageView bar;// 随着屏幕移动的线条
	private TextView title1, title2;//
	private ViewPager page;// 滑动变化界面
	private FragmentPagerAdapter adapter;
	private List<Fragment> fragments;
	private int currentPageIndex;// 目前的页面

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		view = inflater.inflate(R.layout.pk, container, false);
		init();
		initTabLine();
		return view;
	}

	@SuppressLint("NewApi")
	private void initTabLine() {
		bar = (ImageView) view.findViewById(R.id.bar);
		Display display = getActivity().getWindow().getWindowManager()
				.getDefaultDisplay();
		DisplayMetrics dMetrics = new DisplayMetrics();// 手机屏幕的宽和高
		display.getRealMetrics(dMetrics);// 向dMetrics中放入当前手机的宽和高
		currentPage1_2 = (dMetrics.widthPixels / 2) - dip2px(getActivity(), 60);
		LinearLayout.LayoutParams lp = (LayoutParams) bar.getLayoutParams();
		lp.width = currentPage1_2;
		lp.leftMargin = dip2px(getActivity(), 60);
		bar.setLayoutParams(lp);
	}

	/**
	 * 初始化数据
	 */
	private void init() {
		title1 = (TextView) view.findViewById(R.id.pk1);
		title2 = (TextView) view.findViewById(R.id.pk2);
		title1.setTextColor(Color.parseColor("#6DCAEC"));
		page = (ViewPager) view.findViewById(R.id.viewPager);
		fragments = new ArrayList<Fragment>();

		fragments.add(new FragmentPK_1());
		fragments.add(new FragmentPK_2());

		// 实例化viewpager的适配器
		adapter = new FragmentPagerAdapter(getActivity()
				.getSupportFragmentManager()) {

			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return fragments.size();
			}

			@Override
			public Fragment getItem(int arg0) {

				return fragments.get(arg0);
			}
		};
		page.setAdapter(adapter);// 给viewpager设置适配器
		// 给viewpager设置监听器
		page.setOnPageChangeListener(new OnPageChangeListener() {

			@SuppressLint("ResourceAsColor")
			@Override
			public void onPageSelected(int position) {
				switch (position) {
				case 0:
					title2.setTextColor(Color.parseColor("#000000"));
					title1.setTextColor(Color.parseColor("#6DCAEC"));
					break;
				case 1:
					title1.setTextColor(Color.parseColor("#000000"));
					title2.setTextColor(Color.parseColor("#6DCAEC"));
					break;
				}
				currentPageIndex = position;

			}

			@Override
			public void onPageScrolled(int position, float positionOffset,
					int positionOffsetPx) {
				LinearLayout.LayoutParams lp = (LayoutParams) bar
						.getLayoutParams();
				if (currentPageIndex == 0 && position == 0) {// 这是从第一个页面到第二个页面
					lp.leftMargin = (int) (dip2px(getActivity(), 60)
							+ currentPageIndex * currentPage1_2 + currentPage1_2
							* positionOffset);
				} else if (currentPageIndex == 1 && position == 0) {
					lp.leftMargin = (int) (dip2px(getActivity(), 60)
							+ currentPageIndex * currentPage1_2 + currentPage1_2
							* (positionOffset - 1));
				}
				bar.setLayoutParams(lp);

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub

			}
		});
	}

	private int dip2px(Context context, float dipValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (scale * dipValue + 0.5f);

	}

}

还有对应的xml的页面代码为:

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

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

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:gravity="center"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/pk1"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginLeft="60dp"
                android:layout_weight="1"
                android:gravity="center"
                android:text="多人PK"
                android:textSize="20dp" />

            <TextView
                android:layout_width="1dp"
                android:layout_height="10dp"
                android:background="@android:color/darker_gray" />

            <TextView
                android:id="@+id/pk2"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginRight="60dp"
                android:layout_weight="1"
                android:gravity="center"
                android:text="分组PK"
                android:textSize="20dp" />
        </LinearLayout>

        <ImageView
            android:id="@+id/bar"
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:background="@android:color/holo_blue_bright" />
    </LinearLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>

</LinearLayout>

如果有想要Demo的朋友可以留言,并留下邮箱,我给发。

时间: 2024-10-16 08:18:46

基于Android的计步器(Pedometer)的讲解(五)——跟随界面滑动的指示器的相关文章

基于Android的计步器(Pedometer)的讲解(六)——ListView下拉刷新页面

计步器(Pedometer)整个项目的源代码,最近做了比较大的修改,可能以前下载的不能运行,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~) https://github.com/296777513/pedometer 今天实现实现的下拉刷新的功能,先上几张效果图: 如图所示,今天就是要实现的这个效果 首先,分析ListView下拉刷新实现方式 1.需要添加顶部下拉加载页面 2.需要监听onScrollListener来判断当前是否显示在listview的最顶部 3.因为顶部下拉加

基于Android的计步器(Pedometer)的讲解(四)——后台记步

今天先不说Pedometer(计步器)项目UI方面的了,今天讲一个基于重力加速度的记步功能传感器(Sensor),然后 在后台开启记步. 计步器(Pedometer)整个项目的源代码,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~) https://github.com/296777513/pedometer 先上几张效果图:(效果和上一篇讲到的CircleBar非常的相似,因为记步功能在后台) 如图所示,能根据你的一些基本参数,来记步.有一个缺点,因为这个是根据感应加速度来计算是

基于Android的计步器(Pedometer)的讲解(二)——柱状图分析

写正文之前,小小的吐槽一下,还有一个月就放假了,作业.考试.还有实习(研一,下半学期课不多,也不想在实验室)的考虑,最近基于hadoop的数据分析马上也要验收了,真的忙的"外焦里嫩"啊!目前定的方向是Android开发,所以想过年来了找一个Android的实习工作,提高一点在真正的项目中的经验. 好了,说了这么多废话,开始进入正题吧. 整个计步器的项目已经上传到github上了,感兴趣的朋友可以去看看(最好能给小弟我打颗星星哦~) https://github.com/29677751

基于Android的计步器(Pedometer)的讲解-序(修改)

今天本来想说listview中的下拉刷新数据的,但是突然想到一些比较好的想法. 用了一天的时间将Pedometer这个项目其中的网络功能.照片和一些逻辑功能做了修改,所以在这里有必要和大家讲一下,以前下载的Pedometer程序可能不能运行了. 计步器(Pedometer)整个项目的源代码,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~) https://github.com/296777513/pedometer 头像由以前的路径存储变为二进制存储,这样大家可以看到传到网上的头像

基于Android的计步器(Pedometer)的讲解(三)——CircleBar(圆形进度条)

计步器(Pedometer)整个项目的源代码,感兴趣的朋友可以下载来看看(记得帮小弟在github打个星~) https://github.com/296777513/pedometer 本篇文章讲的demo在这里下载(0分下载): http://download.csdn.net/detail/a296777513/8328461 先给几张效果图: 如上图所示,点击中间的圆圈会依次显示3个不同的页面(信息),而且圆形的进度条是动态增加的,效果还是可以的.然后给出源代码,供大家参考 Circle

基于Android的计步器(Pedometer)的讲解(一)——Fragment页面跳转

首先需要做的是实现几个页面的跳转,既类似微信的点击按钮,切换页面. 话不多说,这是一个简单的页面切换的Demo,先贴几张实现的效果: 图片的底部是5个RadioButton,用来进行页面之间的切换.剩下的部分是一个LinearLayout的布局,用来镶嵌5个Fragment(碎片)的页面. 一共用到5个类:MainActivity.MyAdapter.FragmentHistory.FragmentAnalysis.FragmentPedometer.FragmentPK.FragmentSet

基于Android平台的i-jetty网站智能农业监控系统

基于android平台i-jetty网站的智能农业监控系统 摘要:传统的监控系统,一般是基于PC的有线通信传输,其有很多不足之处,如功耗较高.布线成本高.难度大,适应性差,可扩展性不强,增加新的通信线路需要再次布线施工,而且维护起来也比较麻烦,一旦线路出问题,需要繁琐的检查.而嵌入式Web监控系统是基于物联网技术,其无线通信技术具有成本低廉.适应性强.扩展性强.信息安全.使用维护简单等优点. 智能农业中,种植大棚是通过大棚内安装温湿度以及光照传感器,来对农作物的环境参数进行实时采集,由Web监控

Android系统以及Activity启动讲解

一.Android系统启动 Android框架架构图:(来自网上,我觉得这张图看起来很清晰) Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用.启动的过程如下图所示:(图片来自网上,后面有地址) Android系统整个过程如下: (一) Init进程的启动 init进程,它是一个由内核启动的用户级进程.内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程.init

分享基于Android系统的XMPP即时通讯技术项目实战(仿微信开发架构,自定义控件)

即时通讯技术是 网络技术中的明珠.即时通讯产品改变了人们的生活习惯.经过十几年的发展,即时通讯功能的应用也逐渐从专门软件才能实现的功能逐渐成为标准配置.即时通讯技术的应用不仅仅只是用于社交领域,在大多的协同工作领域,以及需要分布结构的网络通讯领域都是非常重要的.讲师本人在android领域有多年的开发经验,在即时通讯系统方面也有深入的研究.在本课程中,详细讲解了android开发中要解决的一些主要的问题,即时通讯在客户端实现的过程,并手把手的进行操作,方便学习和理解.因为课时的原因,对于一些初级