先看一下效果图
先说一下原理,“一”、“二”、“三”是三个按钮,在三个按钮下面有两个TextView,一个是青色的,一个是灰色的,通过不断调整青色TextView的宽度,来达到颜色渐变的效果。按钮下面是一个ViewPager+Fragment来是滑动翻页。
这里布局文件非常重要,我先把布局文件贴出来,activity_main.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" android:background="@android:color/white" > <span style="color:#33ff33;"> <LinearLayout android:id="@+id/gradation_back" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/cywnText" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="#99ff33" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:background="#d3d3d3" /> </LinearLayout></span> <LinearLayout android:id="@+id/top_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="horizontal" > </LinearLayout> <android.support.v4.view.ViewPager android:id="@+id/gradation_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/top_bar" /> </RelativeLayout>注意青色字体的那部分代码,灰色(#d3d3d3)背景TextView的宽度是match_parent,这个是match_parent在这里并没有占据屏幕的整个宽度,因为在灰色的TextView前面定义了一个青色(#99ff33)背景的TextView,所以系统会首先要满足青色背景的TextView的宽度要求,之后剩下的屏幕宽度才会被灰色背景的TextView占满。所以我们在代码中只需要不断调整青色背景的TextView的宽度即可。
初始化控件并实现ViewPager的滑动翻页功能。
private void init() { // TODO Auto-generated method stub grabackll = (LinearLayout) findViewById(R.id.gradation_back); topll = (LinearLayout) findViewById(R.id.top_bar); cywnTxt = (TextView) findViewById(R.id.cywnText); graViewPager = (ViewPager) findViewById(R.id.gradation_pager); initFragment(); graAdapter = new GraAdapter(getSupportFragmentManager(), fList); graViewPager.setAdapter(graAdapter); graViewPager.setOnPageChangeListener(new GraPagerChangeListener()); graViewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub float newX; // 判断手指在屏幕上的滑动方向 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: oldX = event.getX(); break; case MotionEvent.ACTION_MOVE: newX = event.getX(); if (newX - oldX > 0) type = 1; else if (newX - oldX < 0) type = 0; break; } return false; } }); initTopBar(); setGraWidth(((float) screenWidth) / 3); }
/** * 添加滑动界面,这里添加了三个界面,相应的TopBar就应该分成三部分 */ private void initFragment() { // TODO Auto-generated method stub GraFragment1 f1 = new GraFragment1(); GraFragment2 f2 = new GraFragment2(); GraFragment3 f3 = new GraFragment3(); fList.add(f1); fList.add(f2); fList.add(f3); }
private void initTopBar() { // 将三个按钮添加topbar LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT); params.weight = 1; String[] array = { "一", "二", "三" }; for (int i = 0; i < 3; i++) { Button btn = new Button(this); btn.setBackgroundColor(Color.TRANSPARENT); btn.setTag(String.valueOf(i+1)); btn.setText(array[i]); btn.setOnClickListener(this); topll.addView(btn, params); } // 设置背景色高度与topbar一致 ViewTreeObserver vto = topll.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { int height = topll.getMeasuredHeight(); int width = topll.getMeasuredWidth(); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) grabackll .getLayoutParams(); if (width > height) { params.width = width; params.height = width; } else { params.width = height; params.height = height; } grabackll.setLayoutParams(params); return true; } }); }
/** * 设置青色背景的TextView的宽度 * * @param width */ private void setGraWidth(float width) { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) cywnTxt .getLayoutParams(); params.width = (int) width; cywnTxt.setLayoutParams(params); }
private class GraPagerChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int state) { // TODO Auto-generated method stub switch (state) { case ViewPager.SCROLL_STATE_DRAGGING:// 这个状态表示手指正在滑动ViewPager,为了防止连续的快速滑动导致索引值的偏差,在滑动时加载索引值 oldindex = index; break; case ViewPager.SCROLL_STATE_IDLE:// 这个状态表示ViewPager停止滑动,滑动停止时由新的将新的索引值赋给oldindex oldindex = index; offsetX = 0; break; case ViewPager.SCROLL_STATE_SETTLING:// 这个状态表示手指不在屏幕上滑动ViewPager,但由于惯性ViewPager还在继续滑动 break; } } @Override public void onPageScrolled(int position, float scaleDist, int dist) { // TODO Auto-generated method stub //在滑动过程中改变青色背景TextView的宽度 if (scaleDist != 0) switch (type) { case 0:// 向右滑动 dis = ((float) screenWidth) / 3 * scaleDist; setGraWidth(((float) screenWidth) / 3 * (oldindex) + dis + offsetX); break; case 1:// 向左滑动 dis = ((float) screenWidth) / 3 * (1 - scaleDist); setGraWidth(((float) screenWidth) / 3 * (oldindex) - dis - offsetX); break; } } @Override public void onPageSelected(int position) { // TODO Auto-generated method stub index = position + 1; offsetX = ((float) screenWidth) / 3 * (Math.abs(index - oldindex) - 1); } }
@Override public void onClick(View v) { // TODO Auto-generated method stub int position = graViewPager.getCurrentItem(); int newPosition = Integer.valueOf(v.getTag().toString()) - 1; if (newPosition > position) type = 0; else if (newPosition < position) type = 1; graViewPager.setCurrentItem(newPosition); }
package com.example.gradationbar; import java.util.ArrayList; import java.util.List; import android.graphics.Color; import android.graphics.Point; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.Display; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnGenericMotionListener; import android.view.View.OnTouchListener; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends FragmentActivity implements OnClickListener { private LinearLayout grabackll, topll; private TextView cywnTxt; private ViewPager graViewPager; private List<Fragment> fList = new ArrayList<Fragment>(); private GraAdapter graAdapter; private int screenWidth; private int oldindex = 1, index = 1; private float dis; private static int type = 0;// 0表示向右,1表示向左 private float oldX; private float offsetX = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取屏幕宽度 Display dispaly = getWindowManager().getDefaultDisplay(); screenWidth = dispaly.getWidth(); init(); } private void init() { // TODO Auto-generated method stub grabackll = (LinearLayout) findViewById(R.id.gradation_back); topll = (LinearLayout) findViewById(R.id.top_bar); cywnTxt = (TextView) findViewById(R.id.cywnText); graViewPager = (ViewPager) findViewById(R.id.gradation_pager); initFragment(); graAdapter = new GraAdapter(getSupportFragmentManager(), fList); graViewPager.setAdapter(graAdapter); graViewPager.setOnPageChangeListener(new GraPagerChangeListener()); graViewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub float newX; // 判断手指在屏幕上的滑动方向 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: oldX = event.getX(); break; case MotionEvent.ACTION_MOVE: newX = event.getX(); if (newX - oldX > 0) type = 1; else if (newX - oldX < 0) type = 0; break; } return false; } }); initTopBar(); setGraWidth(((float) screenWidth) / 3); } /** * 添加滑动界面,这里添加了三个界面,相应的TopBar就应该分成三部分 */ private void initFragment() { // TODO Auto-generated method stub GraFragment1 f1 = new GraFragment1(); GraFragment2 f2 = new GraFragment2(); GraFragment3 f3 = new GraFragment3(); fList.add(f1); fList.add(f2); fList.add(f3); } private void initTopBar() { // 将三个按钮添加topbar LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT); params.weight = 1; String[] array = { "一", "二", "三" }; for (int i = 0; i < 3; i++) { Button btn = new Button(this); btn.setBackgroundColor(Color.TRANSPARENT); btn.setTag(String.valueOf(i + 1)); btn.setText(array[i]); btn.setOnClickListener(this); topll.addView(btn, params); } // 设置背景色高度与topbar一致 ViewTreeObserver vto = topll.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { int height = topll.getMeasuredHeight(); int width = topll.getMeasuredWidth(); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) grabackll .getLayoutParams(); if (width > height) { params.width = width; params.height = width; } else { params.width = height; params.height = height; } grabackll.setLayoutParams(params); return true; } }); } /** * 设置青色背景的TextView的宽度 * * @param width */ private void setGraWidth(float width) { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) cywnTxt .getLayoutParams(); params.width = (int) width; cywnTxt.setLayoutParams(params); } private class GraPagerChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int state) { // TODO Auto-generated method stub switch (state) { case ViewPager.SCROLL_STATE_DRAGGING:// 这个状态表示手指正在滑动ViewPager,为了防止连续的快速滑动导致索引值的偏差,在滑动时加载索引值 oldindex = index; break; case ViewPager.SCROLL_STATE_IDLE:// 这个状态表示ViewPager停止滑动,滑动停止时由新的将新的索引值赋给oldindex oldindex = index; offsetX = 0; break; case ViewPager.SCROLL_STATE_SETTLING:// 这个状态表示手指不在屏幕上滑动ViewPager,但由于惯性ViewPager还在继续滑动 break; } } @Override public void onPageScrolled(int position, float scaleDist, int dist) { // TODO Auto-generated method stub //在滑动过程中改变青色背景TextView的宽度 if (scaleDist != 0) switch (type) { case 0:// 向右滑动 dis = ((float) screenWidth) / 3 * scaleDist; setGraWidth(((float) screenWidth) / 3 * (oldindex) + dis + offsetX); break; case 1:// 向左滑动 dis = ((float) screenWidth) / 3 * (1 - scaleDist); setGraWidth(((float) screenWidth) / 3 * (oldindex) - dis - offsetX); break; } } @Override public void onPageSelected(int position) { // TODO Auto-generated method stub index = position + 1; offsetX = ((float) screenWidth) / 3 * (Math.abs(index - oldindex) - 1); } } @Override public void onClick(View v) { // TODO Auto-generated method stub int position = graViewPager.getCurrentItem(); int newPosition = Integer.valueOf(v.getTag().toString()) - 1; if (newPosition > position) type = 0; else if (newPosition < position) type = 1; graViewPager.setCurrentItem(newPosition); } }GraAdapter
package com.example.gradationbar; import java.util.List; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class GraAdapter extends FragmentPagerAdapter { private List<Fragment> fList; public GraAdapter(FragmentManager fm, List<Fragment> fList) { super(fm); this.fList = fList; // TODO Auto-generated constructor stub } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return fList == null ? null : fList.get(arg0); } @Override public int getCount() { // TODO Auto-generated method stub return fList == null ? -1 : fList.size(); } }
package com.example.gradationbar; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class GraFragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater.inflate(R.layout.fragment_gra, null); TextView graTxt = (TextView) view.findViewById(R.id.fragment_gra); graTxt.setText("我是第一个界面"); return view; } }GraFragment2
package com.example.gradationbar; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class GraFragment2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater.inflate(R.layout.fragment_gra, null); TextView graTxt = (TextView) view.findViewById(R.id.fragment_gra); graTxt.setText("我是第二个界面"); return view; } }GraFragment3
package com.example.gradationbar; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class GraFragment3 extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater.inflate(R.layout.fragment_gra, null); TextView graTxt = (TextView) view.findViewById(R.id.fragment_gra); graTxt.setText("我是第三个界面"); return view; } }fragment_gra.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" android:background="@android:color/white" > <TextView android:id="@+id/fragment_gra" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:textColor="@android:color/black" android:textSize="20sp" /> </RelativeLayout>
原文地址:http://blog.csdn.net/qmln31821007/article/details/43700151