手势拖动布局,出现新区域


     博客开通了有几个月了,一直没当回事儿; 前几天才发现它的重要性, 遂找出来记录下自己平时的点滴,哪怕是心情也好;

     话不多说,如题所述,在我的布局已经定格的时候,突然有个怪诞的需求,对整个布局进行拖动,出现新布局?  首先想到的是通过手势监听-布局的整体移动-显示事先隐藏的布局,然后开始实现 。

     先上张效果图看看样子再说··············

     1. 定格的UI.  

 注: 由于项目还在进行中, 其中的内容不便公开,毕竟签过卖身契  见谅哈  看官们要的是效果哈  [刚才上传照片的时候 吓着了  这么大   本图是经过本人用PS用红色覆盖 暂且无视哈]

     好  那么接下来 操作过后的效果示意图出现了-

     2.通过手势滑动后, 显示出事先预设的场景   上传个图这么费劲啊、  又被吓了一次、 图真大

好啦   效果一般 就是顶部通过手势下拉  出现了两个按钮,然后通过上推还原,或者点击跳转到具体设置界面都可以; 还没来得及做;

其实看似简单的一个小过程, 耗费了自己不少的经历去摸索-实现,咱要的是思路,不是复制过来就能实现的那种代码哈  再说咱也不能把客户的money这么快的曝光, 请见谅哈

  具体实现开始·········

   布局文件----------------------

<LinearLayout 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:orientation="vertical"
    android:background="#383838">

    	<LinearLayout android:id="@+id/help_ll"
    	    android:layout_width="match_parent"
    	    android:layout_height="wrap_content"
    	    android:orientation="horizontal"
    	    android:visibility="gone">
    	    <Button android:id="@+id/help_btn"
    	        android:layout_marginLeft="30dp"
    	        android:layout_width="wrap_content"
    	        android:layout_height="wrap_content"
    	        android:text="帮助"/>
    	    <Button android:id="@+id/cancel"
    	        android:layout_width="wrap_content"
    	        android:layout_height="wrap_content"
    	        android:text="注销"/>
    	</LinearLayout>
    
    	
    	<LinearLayout android:id="@+id/all_ll"
    	    android:orientation="vertical"
    	    android:layout_width="match_parent"
    	    android:layout_height="match_parent">
    
	        <LinearLayout android:id="@+id/main_menu_title_ll"
	            android:layout_width="match_parent"
	            android:orientation="horizontal"
	            android:paddingLeft="9dp"
	            android:paddingRight="9dp"
	            android:gravity="center_vertical"
	            android:layout_height="wrap_content">
	            
	            <Button android:id="@+id/menu_title_scape_button"
	                style="@style/main_menu_title_ll_button"
	                android:background="@drawable/title_btn_with_down_arrow"
	                android:text="销售一区"/>
	            <Button
	                android:id="@+id/menu_title_time_button"
	                style="@style/main_menu_title_ll_button"
	                android:background="@drawable/title_btn_with_down_arrow"
	                android:text="02/17-02/26" />
	          ·····················
 	<LinearLayout android:id="@+id/main_menu_item"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_marginTop="0dp"
             android:layout_marginLeft="10dp"
             android:layout_marginRight="10dp"
             android:paddingLeft="9dp"
             android:paddingRight="9dp"
             android:longClickable="true"
             android:orientation="vertical">
             
            <LinearLayout 
                android:id="@+id/menu_item_31_ll"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_vertical"
                android:layout_weight="1">
                
                <com.broadtext.lspkpi.view.MenuItemLeftButton android:id="@+id/view1"
                style="@style/main_menu_items_view_style"/>
                
                <com.broadtext.lspkpi.view.MenuItemLeftButton android:id="@+id/view2"
                style="@style/main_menu_items_view_style"/>
                
                <com.broadtext.lspkpi.view.MenuItemRightButton android:id="@+id/view3"
                style="@style/main_menu_items_view_style"/>
             //中间略去一大堆 堆砌代码 重点看上面的··················
        </LinearLayout>

 

        上面是一些残缺不全的布局文件,但是重要的部分全部列出来了

       1.  我用了个比较笨的办法, 先将要显示的布局隐藏掉, 操作之后再将其visible;

       2.一定要将触摸的区域设置成·············  android:longClickable="true"      否则无法进行监听, 会与视图的点击事件冲突(我的触摸区域就是下面的9个item,同时也有点击事件+上下推事件)

       3.因为特殊需求, Android原生的控件已经不能满足, 只能自己重写控件【跟此处的实现没关系】, 感觉很爽的哈、 前提是你得熟悉下思路, 本文重点不在重写控件(本项目中几乎所有的显示控件都是自己重写的,将近10个吧),以后会着重写一篇博文,虽说中级开发者可以游刃有余的重写需要的控件,但是自我感觉--自己依然很菜呀!!!

      

       又说了些废话, 赶紧上主题哈、  下面就是Java代码部分核心实现············

     

public class MainLSPKPIActivity extends Activity implements OnClickListener, OnGestureListener, OnTouchListener {
 
	private GestureDetector gestureDetector;//手势监听-为了[上推]事件而准备。
	@Override
 	protected void onCreate(Bundle savedInstanceState) {
		gestureDetector = new GestureDetector(this, this);//手势监听初始化
		
	}
	//设置点击事件-触摸事件
	private void setListeners() {
  		menuTitle1Btn.setOnClickListener(this);
  		menuTitle2Btn.setOnClickListener(this);
  		menuTitle3Btn.setOnClickListener(this);
  		menuTitle4Btn.setOnClickListener(this);
  		menuTitleLL.setOnTouchListener(this);
  		menuTitle1Btn.setOnTouchListener(this);
  		menuTitle2Btn.setOnTouchListener(this);
  		menuTitle3Btn.setOnTouchListener(this);
  		menuTitle4Btn.setOnTouchListener(this);
  
  		menuItem.setOnTouchListener(this);//设置触摸监听事件,捕捉上推动作。
 		view1.setOnTouchListener(this);
  		view2.setOnTouchListener(this);
 		view3.setOnTouchListener(this);
  		view4.setOnTouchListener(this);
  		view5.setOnTouchListener(this);
  		view6.setOnTouchListener(this);
  		view7.setOnTouchListener(this);
  		view8.setOnTouchListener(this);
  		view9.setOnTouchListener(this);
  		toLineChartLayout.setOnTouchListener(this);
  		toLineChartView.setOnTouchListener(this);
  
  		view1.setOnClickListener(this);
  		view2.setOnClickListener(this);
  		view3.setOnClickListener(this);
  		view4.setOnClickListener(this);
  		view5.setOnClickListener(this);
  		view6.setOnClickListener(this);
  		view7.setOnClickListener(this);
  		view8.setOnClickListener(this);
  		view9.setOnClickListener(this);
 	}
 
	

/**   * 监听back键。   */  public boolean onKeyDown(int keyCode, KeyEvent event) {   if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {    Dialog alertDialog = new AlertDialog.Builder(this).                  setTitle("退出系统").                  setMessage("您确定退出系统吗?").                  setIcon(R.drawable.ic_launcher).                  setPositiveButton("确定", new DialogInterface.OnClickListener() {                      @Override                      public void onClick(DialogInterface dialog, int which) {                       finish();        System.exit(0);                      }                  }).                  setNegativeButton("取消",null). create();          alertDialog.show();    return true;   }   return super.onKeyDown(keyCode, event);  }    /**   * -----------------------------------手势监听----------------------------------------------   * 实现方法     onDown()、 onFling()、 onLongPress()、 onScroll()、onShowPress()、onSingleTapUp()、   */  @Override  public boolean onDown(MotionEvent e) {   return false;  }

 boolean helpLLIsShowed = false;//帮助界面是否已经显示。    @Override  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   if(menuItem22isRefreshed) {    if(e1.getY() - e2.getY() > 3) {     resetTitleBtnBackground();     Toast.makeText(this, "---手势向上推---", Toast.LENGTH_SHORT).show();     menuLL21.setVisibility(View.GONE);     forbidViewsClick(true);//允许9view。折线图点击事件。     forbidLineChartClick(true);          //上推--主界面刷新     initInData();//---查询SQL, 传入不同字段, 刷新界面数据     stepCount = 0;//将刷新步调调至0,重新刷新界面。     myHandler.post(viewsRunnable);//退出后继续动画。     showDownAnimation(toLineChartLayout, 150, 0);//当点击任何一个二级菜单按钮时,底部9个菜单上浮。     //上推--折线图刷新。     handleDynamicLineChartRefresh(lineChartItemFlag);          menuItem22isRefreshed = false;//当界面向上推之后,禁止再次上推刷新--当点击titleBtn时可解禁。     return true;    }   }      if(!helpLLIsShowed) {    if(e2.getY() - e1.getY() > 20) {//向下拉---显示帮助按钮。     Toast.makeText(getApplicationContext(), "下拉动作", Toast.LENGTH_SHORT).show();     helpLL.setVisibility(View.VISIBLE);     showDownAnimation(allLL, -100, 0);     helpLLIsShowed = true;     return true;    }   }      if(helpLLIsShowed) {//上推。    if(e1.getY() - e2.getY() > 20) {     helpLL.setVisibility(View.GONE);     showDownAnimation(allLL, 100, 0);    }    helpLLIsShowed = false;   }      return true;  }

 @Override  public void onLongPress(MotionEvent e) {  }

 @Override  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {   return false;  }

 @Override  public void onShowPress(MotionEvent e) {  }

 @Override  public boolean onSingleTapUp(MotionEvent e) {   return false;  }  //------------------------------------手势监听------------------------------------------------

 /**   * 触摸事件监听   * 此处是为了手势gesture监听做准备, 将触摸事件传递给gesture--   * gestureDetector.onTouchEvent(event)   */  @Override  public boolean onTouch(View v, MotionEvent event) {   //将触摸事件传递给手势监听   return gestureDetector.onTouchEvent(event);  }

 

    又贴了一大堆代码呀!   !!!  呵呵  没关系, 因为这个Java文件有1994行, 包括获取后台JSON 解析 SQLite存储+查询 UI呈现 所以有点膨胀哈 不过这已经分离了很多了、  还有待完善了吧、  继续下文

     最关键的是将gestureDetector把触摸事件传递到gesture的监听中···gestureDetector.onTouchEvent(event);
     粉红色的代码段就是控制按钮显示的关键代码,一定要return true 哈 这样这个fling事件才能继续下去(不知道说的严谨否);

     还有  一定要学会用flag来控制代码执行流程, 这个东西如果运用巧妙 代码立马就生动起来了  记住哦  Boolean很强大

 

      嗯  想了想  第一篇技术博客   还有什么要说的呢 毕竟时间有点紧张  项目本周要交差  晚上实在不想写太多代码了  写写博客得了   就是废话有点多 

     今天这个blog的主题  其实就是一个简单的手势监听处理, 没什么其他技术含量;就算是个开头吧  以后会多记录些有用的实现+代码 分享分享呵、

 

    今后自己要写的博客内容可能涉及到 - - - - - -    先列个提纲  别到时候忘记了   都是自己实现过的东西 呵呵

  百度地图定位 基站定位  地图纠偏 ntlm域验证 webview的使用 绘图-view/surfaceView   二维码扫描{已成功纠正横竖屏} 

  自定义控件 纯Java写布局-动态生成控件  级联菜单【联动概念】 slidemenu侧滑库研究    fragment使用     activity向fragment的迁移【有点难度】     

  视频传输  动画渐变   柱状图  折线图  扇形图【手写 非achartengine】 

  spring4Android框架解析 SQLite大数据存储 优化查询【索引+in函数+】  异步任务研究 - - -

  其实通过项目  我逼着自己学会了PS处理基本的UI只因为我们组没有美工   比较有成就感, 本领都是逼出来的、 能力都是被压出来的

 

      我尽量写的完整些,愚见多些,百分百原创才有记录的价值, 因为都是自己一年来涉及过的知识点吧, 哎  最近事情着实有点多, 工作、生活·· 各方面, 真烦, 没事,程序员嘛, 一到了自己的主战场, 主角依然是自己!

 

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ~~~~~~~~~~~~~~~~~~~~~~ 唯有压力才能突破, 才能距破茧成蝶之日更进一步、~~~~~~~~~~~~~~~~~~
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值