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

来源:互联网 发布:js关闭微信内置浏览器 编辑:程序博客网 时间:2024/06/09 18:50


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

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

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

     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只因为我们组没有美工   比较有成就感, 本领都是逼出来的、 能力都是被压出来的

 

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

 

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

    

原创粉丝点击