仿照微信的滑动指示条,有两种方法
一种是通过计算手势的偏移量,然后使用动画来播放.
还有一种是利用设置不断的设置指示条的位置来控制指示条的移动
这里有一个链接
http://blog.csdn.net/lmj623565791/article/details/25708045
下面例子是本人自己手写的一个自定义View,通过自定义View来控制指示条移动
使用的是通过设置指示条的左边距来控制指示条的位置,从而达到了滑动的效果
package com.siyehuazhilian.view;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
/**
* 自定义View,用来拦截手势,添加自定义动画
*
* @author Administrator
*
*/
@SuppressLint("NewApi")
public class MyLinearLayout extends LinearLayout {
// 手指刚接触坐标x
private float startX = 0;
// 手指滑动的距离
private float distance = 0;
// 指示条的左边距大小
private int lefiDiatance = 0;
// 是否选择了别人选项卡标志位:true表示有,false表示没有.默认为没有;
private boolean ifChangedRadioButton = false;
// 屏幕的宽度
private int width = 0;
private Context context;
// 指示条
private ImageView slidingImageView;
public MyLinearLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public MyLinearLayout(Context context) {
super(context);
init(context);
}
private void init(Context context) {
this.context = context;
}
public void setImageView(ImageView imageView) {
slidingImageView = imageView;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// 得到屏幕的宽度和高度
DisplayMetrics display = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay()
.getMetrics(display);
width = display.widthPixels;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 开始必须把选项是否改变的标志位设置为false;
ifChangedRadioButton = false;
// 得到当前指示条的左边距
lefiDiatance = ((RelativeLayout.LayoutParams) slidingImageView
.getLayoutParams()).leftMargin;
// 获得开始点的坐标
startX = event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
// 获得手指一定的距离
distance = event.getRawX() - startX;
if ((lefiDiatance <= 0 && distance > 0)
|| (lefiDiatance >= width / 4 * 3 && distance < 0)) {
// 如果指示条在最左边,就无法继续往左移动,同样如果在最右边,则无法往最右边移动
} else {// 满足移动条件就移动:通过设置指示条的左边距来控制指示条的移动
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) slidingImageView
.getLayoutParams(); // 取控件slidingImageView当前的布局参数
// 内边距必须加上原来的内边距,而且移动的距离必须除以4,因为指示条只有四分之一的屏幕宽度
layoutParams.setMargins((int) (-distance / 4) + lefiDiatance,
0, 0, 0);
slidingImageView.setLayoutParams(layoutParams);
}
break;
case MotionEvent.ACTION_UP:
if (!ifChangedRadioButton) {// 如果移动的距离没有选择另一个选项卡,就把滚动条归位
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) slidingImageView
.getLayoutParams(); // 取控件slidingImageView当前的布局参数
layoutParams.setMargins(lefiDiatance, 0, 0, 0);
slidingImageView.setLayoutParams(layoutParams);
}
break;
default:
break;
}
return false;
}
}