我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android Moveview滑屏移动视图类完整实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android Moveview滑屏移动视图类完整实例

本文示例所述程序为一个Android Moveview移动视图类。其主要实现主屏左右滑屏拖动功能,并适时显示拖动时候屏幕的显示情况,该代码中还包括完整的逻辑。其完整代码如下:


import android.study.shift.ItemView;
import android.study.shift.MainView;
import android.study.shift.Moveview;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.MeasureSpec;
public class Moveview extends ViewGroup{
 private final static int TOUCH_STATE_REST = 0;
 private final static int TOUCH_STATE_MOVING = 1;
 private final static int MOVE_TO_LEFT = 1;
 //private final static int MOVE_TO_RIGHT = 2;
 private final static int MOVE_TO_REST = 0;
 public final static int MAIN = 0;
 public final static int LEFT = 1;
 public final static int RIGHT = 2;
 private int touch_state = TOUCH_STATE_REST;
 private int move_state = MOVE_TO_REST;
 private int now_state = MAIN;
 private final float WIDTH_RATE = 0.18f;
 private MainView main_show_view;
 private ItemView left_show_view;
 private int min_distance = 30;//此处只是初始化为30 ,其实不起作用
 private int screen_w;
 private int screen_h;
 private int move_x_v;
 private boolean isAimationMoving = false;
 private Handler mHandler = new Handler() {
 public void handleMessage(Message msg) {//处理消息
  synchronized (Moveview.this) {//同步
  isAimationMoving = true;
  int move_change = (int) (screen_w * WIDTH_RATE / 5);
  int left = main_show_view.getView().getLeft();
  if (msg.what == 1) {//主屏在向右拖曳。。。
   move(move_change + left);//参数为拖出来后主屏的坐标。
  }
  if (msg.what == 11) {
   isAimationMoving = false;
   moveToLeft(false); //满足可以显示的要求开始显示,false只是一个判定条件,以区别按钮起的效果
  }
  if (msg.what == 2) {//代表主屏向左在拖曳。。。
   move(-1 * move_change + left);
  }
  if (msg.what == 12) {
   isAimationMoving = false;
   //moveToRight(false);
  }
  if (msg.what == 0) {
   if (now_state == LEFT) {//如果现在已经显示左边
   move(-1 * move_x_v);//那么还原成主屏
   } else {
   move(move_x_v);
   }
  }
  if (msg.what == 10) {
   isAimationMoving = false;
   moveToMain(false);
  }
  }
 }
 };
 public Moveview(Context context) {
 super(context);
 }
 public Moveview(Context context, AttributeSet attrs) {
 super(context, attrs);
 }
 public Moveview(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 }
 public void initView() {
 if (main_show_view == null) {
  main_show_view = new MainView(this.getContext(), this);
  left_show_view = new ItemView(this.getContext());
  //right_show_view = new ItemView(this.getContext(), "aaa");
 }
 this.addView(left_show_view.getView());
 //this.addView(right_show_view.getView());
 this.addView(main_show_view.getView());
 }
 public void initContent() {
 }
 public void move(int start) {//本函数显示拖动的时候屏幕的显示情况。
 int left = main_show_view.getView().getLeft();//left代表主屏左边缘的位置坐标。
 if (now_state == MAIN) {
  if (left > 0) {//如果屏幕的左边被移向右,则left变成正数
  if (move_state != MOVE_TO_LEFT) {
   move_state = MOVE_TO_LEFT;
  }
  left_show_view.getView().setVisibility(View.VISIBLE);//设置左边可见
  //right_show_view.getView().setVisibility(View.GONE);
  } //else if (left < 0) {//如果屏幕的左边被移向左,则left变成负数
  //if (move_state != MOVE_TO_RIGHT) {
  // move_state = MOVE_TO_RIGHT;
  //}
  //right_show_view.getView().setVisibility(View.VISIBLE);
  //left_show_view.getView().setVisibility(View.GONE);
  //}
   else {
  move_state = MOVE_TO_REST;
  }
  main_show_view.getView().layout(start, 0, start + screen_w,
   screen_h);//参数依次为左、上、右、下。
 } else {
  left = (int) (screen_w * WIDTH_RATE);//left为左边应该留出的控件空间,或者主屏左边应该在的位置
  if (now_state == RIGHT) {
  left = -1 * left;//若状态是在右边空出来,则主屏的左边为负数
  }
  left = left + start;
  main_show_view.getView().layout(left, 0, left + screen_w, screen_h);
 }
 }
 @Override
 protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
 if (move_state == MOVE_TO_REST) {
  if (now_state == MAIN) {
  int w = (int) (screen_w * WIDTH_RATE);//留下预定的宽度,显示各个view的参数设置。
  main_show_view.getView().layout(0, 0, screen_w, screen_h);
  left_show_view.getView().layout(0, 0, w, screen_h);
  } else if (now_state == LEFT) {
  moveToLeft(false);
  } else {
  }
 }
 }
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 main_show_view.getView().measure(widthMeasureSpec, heightMeasureSpec);
 left_show_view.getView().measure(MeasureSpec.UNSPECIFIED,//unspecified为未指定的
  heightMeasureSpec);
 left_show_view.setWidth((int) (screen_w * WIDTH_RATE));//设置view宽度
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);//调用父类的构造函数
 }
 private int start_x;
 private int start_y;
 private boolean isMoved;
 public boolean dispatchTouchEvent(MotionEvent ev) {//分发触摸消息事件
 if (isAimationMoving) {
  return super.dispatchTouchEvent(ev);
 } else {
  int action = ev.getAction();
  float x = ev.getX();
  float y = ev.getY();
  switch (action) {
  case MotionEvent.ACTION_DOWN:
  super.dispatchTouchEvent(ev);
  start_y = (int) y;
  move_x_v = 0;
  if (this.touch_state == TOUCH_STATE_REST) {
   this.touch_state = TOUCH_STATE_MOVING;
   start_x = (int) x;
   isMoved = false;
   move_state = MOVE_TO_REST;
  }
  break;
  case MotionEvent.ACTION_MOVE:
  int last_y = (int) y;
  int last_x = (int) x;
  super.dispatchTouchEvent(ev);
  if (!isMoved) {
   if (Math.abs(last_y - start_y) > Math.abs(last_x - start_x)) {//如果Y上面移动的距离大于X上面移动的距离。
   super.onTouchEvent(ev);
   return true;
   } else {//X移动距离大于Y
   if (Math.abs(last_x - start_x) > 5) {//X移动距离大于5就被认为移动了
    isMoved = true;
   }
   }
  }
  if (isMoved) {
   if (this.touch_state == TOUCH_STATE_MOVING) {
   if (Math.abs(last_x - start_x) > 10) {//如果移动的X距离大于10
    int left = main_show_view.getView().getLeft();
    Log.d("msg", "left:" + left);
    Log.d("msg", "x:" + last_x);
    isMoved = true;
    int move_x = last_x - start_x;
    if (move_x > 0 && now_state == LEFT) {//方向正确的移动才算是移动的状态
    isMoved = false;
    break;
    }
    if (move_x < 0 && now_state == RIGHT) {//如果现在在显示右边,那么再向右移就不反应。
    isMoved = false;
    break;
    }
    if (move_x < 0 && now_state ==MAIN){//如果现在在主屏,向右移动也是无效的
    isMoved = false;
    break;
    }
    if (move_x > 234 && now_state ==MAIN){
    isMoved = true;//设置为true那么移动还是发生了,break之后还是会在ACTIONUP中起作用
    break;//break之后不会执行下面的move()语句,
    }
    if (move_x < -234 && now_state ==LEFT){
    isMoved = true;
    break;
    }
    move(move_x);//以移动的距离为参数调用move()实现移动的动态显示
   }
   }
   return false;
  }
  break;
  case MotionEvent.ACTION_UP://
  if (this.touch_state == TOUCH_STATE_MOVING) {
   if (isMoved) {
   last_x = (int) x;
   if (Math.abs(last_x - start_x) > min_distance) {//
    if (now_state == MAIN) {
    if (move_state == MOVE_TO_LEFT) {
     this.moveToLeft(false);
    }
    } else {
    this.moveToMain(false);
    }
   } else {  //
    if (now_state == MAIN) {
    this.moveToMain(false);
    }
    if (now_state == LEFT) {
    this.moveToLeft(false);
    }
    if (now_state == RIGHT) {
    //this.moveToRight(false);
    }
   }
   move_state = MOVE_TO_REST;
   }  else {
   super.dispatchTouchEvent(ev);
   this.touch_state = TOUCH_STATE_REST;
   return false;//
   }
  }
  super.onTouchEvent(ev);
  this.touch_state = TOUCH_STATE_REST;
  break;
  }
  return true;
 }
 }
 public boolean getIsMoved() {
 return isMoved;
 }
 public void moveToLeft(boolean b) {
 if (!b) {
  int move_x = (int) (screen_w * WIDTH_RATE);
  left_show_view.getView().layout(0, 0, screen_w, screen_h);
  //right_show_view.getView().layout(move_x, 0, move_x * 2, screen_h);
  main_show_view.getView().layout(move_x, 0, move_x + screen_w,
   screen_h);
  now_state = LEFT;//为什么现在又把now_state赋值为left?
 }
//  else {//else以及括号中的语句都是为原来的按钮准备的。。。
//  mHandler.postDelayed(new Runnable() {//一个新的可运行的函数
//
//  @Override
//  public void run() {
//   int move_change = (int) (screen_w * WIDTH_RATE / 5);//五分之一要显示的宽度
//   int left = (int) (screen_w * WIDTH_RATE - main_show_view
//    .getView().getLeft());//getleft()返回的是主屏左边缘离左边的距离
//   Message msg = new Message();
//   if (left > move_change) {//括号里面不懂,起什么作用?
//   msg.what = 1;
//   mHandler.sendMessage(msg);
//   mHandler.postDelayed(this, 10);//又调用自己,基本上非要是小于关系
//   } else {
//   msg.what = 11;
//   mHandler.sendMessage(msg);
//   mHandler.removeCallbacks(this);
//   }
//  }
//  }, 0);
// }
 }
 public void moveToMain(boolean b) {
 if (!b) {
  //right_show_view.getView().setVisibility(View.VISIBLE);
  left_show_view.getView().setVisibility(View.VISIBLE);
  int w = (int) (screen_w * WIDTH_RATE);
  main_show_view.getView().layout(0, 0, screen_w, screen_h);
  left_show_view.getView().layout(0, 0, w, screen_h);
  now_state = MAIN;
 }
 }
 public void initScreenSize(int w, int h) {
 this.screen_w = w;
 this.screen_h = h;
 Log.d("screen", "screen_w:" + w);
 this.setKeepScreenOn(true);
 min_distance = (int) (screen_w / 12.0);//min_distance在这里又被初始化为屏幕的一个比例大小
 initView();
 initContent();
 moveToMain(false);
 }
 public int getNowState() {
 return this.now_state;
 }
}
您可能感兴趣的文章:Android使用ViewFlipper和GestrueDetector共同实现滑屏效果实例Android组件banner实现左右滑屏效果Android利用ViewPager实现滑动广告板实例源码Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果Android ViewPager相册横向移动的实现方法Android 使用viewpager实现无限循环(定时+手动)Android App中使用ViewPager+Fragment实现滑动切换效果Android App中ViewPager与Fragment结合的一些问题解决Android App中ViewPager所带来的滑动冲突问题解决方法Android ViewPager无限循环实现底部小圆点动态滑动Android基础之使用Fragment控制切换多个页面Android基础之Fragment与Activity交互详解Android基于ViewPager+Fragment实现左右滑屏效果的方法


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android Moveview滑屏移动视图类完整实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android Moveview滑屏移动视图类完整实例

本文示例所述程序为一个Android Moveview移动视图类。其主要实现主屏左右滑屏拖动功能,并适时显示拖动时候屏幕的显示情况,该代码中还包括完整的逻辑。其完整代码如下:import android.study.shift.ItemVi
2022-06-06

Android中的ViewPager视图滑动切换类的入门实例教程

ViewPager引入示例 首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能。 效果图: 实现了三个view间的相互滑动。 第一个VIEW向第二个VIEW滑动、第二个VIEW向第三个VIEW滑动一、
2022-06-06

Android开发之超强图片工具类BitmapUtil完整实例

本文实例讲述了Android开发之超强图片工具类BitmapUtil。分享给大家供大家参考,具体如下:说明:为了方便大家使用,本人把大家常用的图片处理代码集中到这个类里使用了LruCache与SoftReference/** * 图片加载及
2023-05-30

android开发教程之使用线程实现视图平滑滚动示例

最近一直想做下拉刷新的效果,琢磨了好久,才走到通过onTouch方法把整个视图往下拉的步骤,接下来就是能拉下来,松开手要能滑回去啊。网上看了好久,没有找到详细的下拉刷新的例子,只有自己慢慢琢磨了。昨天和今天,研究了两天,下拉之后回滚回去的效
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录