Android 仿照微信滑动界面

仿照微信的滑动指示条,有两种方法

一种是通过计算手势的偏移量,然后使用动画来播放.

还有一种是利用设置不断的设置指示条的位置来控制指示条的移动

这里有一个链接

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;
	}

}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值