仿百度新闻左右侧滑demo


package com.example.mycehua;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

public class MainActivity extends Activity implements OnTouchListener {

int screenWidth;// 屏幕宽度
View leftMenu, rightContent;// 左menu右content
int left_padding_right = 50;// 左边完全显示时候留给右边的
LinearLayout.LayoutParams menuParams;
int leftEdge; // menu可以滑动到的左边缘
int rightEdge = 0;
float xDown, xMove, xUp;// 手指按下,移动,离开时候的横坐标
boolean isMenuVisiable;// 左边menu是否可见
// boolean isWantShowMenu, iswantShowContent;
public static final int SNAP_VELOCITY = 200;// 指定手指滑动速度 大于这个值则表示滑动起作用
VelocityTracker mVelocityTracker;// 计算手指滑动速度

ImageView mback;
TextView mtv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initValues();
rightContent.setOnTouchListener(this);
}

public void initValues() {
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
screenWidth = windowManager.getDefaultDisplay().getWidth();
leftMenu = findViewById(R.id.left_menu);
rightContent = findViewById(R.id.right_content);
menuParams = (LayoutParams) leftMenu.getLayoutParams();
menuParams.width = screenWidth - left_padding_right;
leftEdge = -menuParams.width;
// 初始化左边缘开始位置
menuParams.leftMargin = leftEdge;
// 初始content的位置占满全屏
rightContent.getLayoutParams().width = screenWidth;

mback = (ImageView) findViewById(R.id.topback);
mtv = (TextView) findViewById(R.id.mtv);
mback.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(isMenuVisiable){
scrollToContent();
}else{
scrollToMenu();
}
}
});
}

public void btnclick(View view) {
Button btn = (Button) view;
switch (view.getId()) {
case R.id.btn1:
mtv.setText(btn.getText());
scrollToContent();
break;
case R.id.btn2:
mtv.setText(btn.getText());
scrollToContent();
break;
case R.id.btn3:
mtv.setText(btn.getText());
scrollToContent();
break;
default:
break;
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
createVelocityTracker(event);//相当于监听了滑动事件
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
// 手指移动时,对比按下时的横坐标,计算出移动的距离,来调整menu的leftMargin值,从而显示和隐藏menu
xMove = event.getRawX();
int distanceX = (int) (xMove - xDown);
if (isMenuVisiable) {
menuParams.leftMargin = distanceX;
} else {
menuParams.leftMargin = leftEdge + distanceX;
}
// 控制左右滑动范围
if (menuParams.leftMargin < leftEdge) {
menuParams.leftMargin = leftEdge;
} else if (menuParams.leftMargin > rightEdge) {
menuParams.leftMargin = rightEdge;
}
leftMenu.setLayoutParams(menuParams);
break;
case MotionEvent.ACTION_UP:
xUp = event.getRawX();
if (wantShowMenu()) {
if(shouldScrollToMenu()){
scrollToMenu();
}else{
scrollToContent();
}
}else if(wantShowContent()){
if(shouldScrollToContent()){
scrollToContent();
}else{
scrollToMenu();
}
}
recycleVelocityTracker();//回收VelocityTracker
break;

default:
break;
}
return true;
}

// 是否显示menu
public boolean wantShowMenu() {
return xUp - xDown > 0 && !isMenuVisiable;
}

// 是否显示content
private boolean wantShowContent() {
return xUp - xDown < 0 && isMenuVisiable;
}

// 是否滑动到menu
public boolean shouldScrollToMenu() {
return xUp - xDown > screenWidth / 2 || getScrollVelocity() > SNAP_VELOCITY;
}

// 是否滑动到content
public boolean shouldScrollToContent() {
return xDown - xUp + left_padding_right > screenWidth / 2 || getScrollVelocity() > SNAP_VELOCITY;
}

// 获取手指在界面滑动速度
public int getScrollVelocity() {
mVelocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) mVelocityTracker.getXVelocity();
return Math.abs(xVelocity);
}
//滑动到menu
private void scrollToMenu() {
new ScrollTask().execute(30);
}
//滑动到content
private void scrollToContent() {
new ScrollTask().execute(-30);
}
//把触摸事件加入到mVelocityTracker
public void createVelocityTracker(MotionEvent event){
if(mVelocityTracker==null){
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
}
//回收mVelocityTracker对象
public void recycleVelocityTracker(){
mVelocityTracker.recycle();
mVelocityTracker = null;
}

class ScrollTask extends AsyncTask<Integer, Integer, Integer>{

@Override
protected Integer doInBackground(Integer... speed) {
// TODO Auto-generated method stub
int leftMargin = menuParams.leftMargin;
while(true){
leftMargin += speed[0];
if(leftMargin>rightEdge){
leftMargin = rightEdge;
break;
}
if(leftMargin<leftEdge){
leftMargin = leftEdge;
break;
}
publishProgress(leftMargin);
sleep(20);
}
if (speed[0] > 0) {
isMenuVisiable = true;
} else {
isMenuVisiable = false;
}
return leftMargin;
}
@Override
protected void onProgressUpdate(Integer... leftMargin) {
menuParams.leftMargin = leftMargin[0];
leftMenu.setLayoutParams(menuParams);
}
@Override
protected void onPostExecute(Integer leftMargin) {
menuParams.leftMargin = leftMargin;
leftMenu.setLayoutParams(menuParams);
}
}
private void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值