当前位置: 首页 > 编程日记 > 正文

android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

http://blog.csdn.net/jj120522/article/details/8095852

示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现.

实现方法:我们自定义一个ViewGroup实现左右滑动,第一屏隐藏,第二屏显示.

代码如下:

[java] view plaincopy
  1. package com.jj.sliding_6;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.util.Log;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.view.ViewTreeObserver;
  8. import android.view.View.MeasureSpec;
  9. import android.view.ViewTreeObserver.OnGlobalLayoutListener;
  10. import android.widget.AbsoluteLayout;
  11. import android.widget.LinearLayout;
  12. import android.widget.ListView;
  13. import android.widget.RelativeLayout;
  14. import android.widget.Scroller;
  15. /***
  16.  * 自定义view
  17.  * 
  18.  * @author zhangjia
  19.  * 
  20.  */
  21. public class MyViewGroup extends ViewGroup {
  22. private Scroller scroller;// 滑动
  23. private int distance;// 滑动距离
  24. private View menu_view, content_view;
  25. private int duration = 500;
  26. private ViewTreeObserver viewTreeObserver;
  27. private Context context;
  28. private CloseAnimation closeAnimation;
  29. public static boolean isMenuOpned = false;// 菜单是否打开
  30. public MyViewGroup(Context context) {
  31. super(context, null);
  32. }
  33. public void setCloseAnimation(CloseAnimation closeAnimation) {
  34. this.closeAnimation = closeAnimation;
  35. }
  36. public MyViewGroup(Context context, AttributeSet attrs) {
  37. super(context, attrs);
  38. this.context = context;
  39. scroller = new Scroller(context);
  40. }
  41. public void setDistance(int distance) {
  42. this.distance = distance;
  43. }
  44. @Override
  45. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  46. if (changed) {
  47. menu_view = getChildAt(0);// 获取滑动菜单的view
  48. content_view = getChildAt(1);// 获得主页view
  49. // 相当于fill_parent
  50. content_view.measure(00);
  51. content_view.layout(00, getWidth(), getHeight());
  52. }
  53. }
  54. @Override
  55. public void computeScroll() {
  56. Log.e("jj""isMenuOpned=" + isMenuOpned);
  57. if (scroller.computeScrollOffset()) {
  58. scrollTo(scroller.getCurrX(), scroller.getCurrY());
  59. postInvalidate();// 刷新
  60. if (closeAnimation != null)
  61. closeAnimation.closeMenuAnimation();
  62. }else{
  63. MainActivity.isScrolling=false;
  64. }
  65. }
  66. void showMenu() {
  67. Log.e("jj""shoeMenu");
  68. isMenuOpned = true;
  69. scroller.startScroll(getScrollX(), 0, -distance, 0, duration);
  70. invalidate();// 刷新
  71. }
  72. // 关闭菜单(执行自定义动画)
  73. void closeMenu() {
  74. Log.e("jj""closeMenu");
  75. isMenuOpned = false;
  76. scroller.startScroll(getScrollX(), 0, distance, 0, duration);
  77. invalidate();// 刷新
  78. }
  79. // 关闭菜单(执行自定义动画)
  80. void closeMenu_1() {
  81. isMenuOpned = false;
  82. scroller.startScroll(getScrollX(), 0, distance - getWidth(), 0,
  83. duration);
  84. invalidate();// 刷新
  85. }
  86. // 关闭菜单(执行自定义动画)
  87. void closeMenu_2() {
  88. isMenuOpned = false;
  89. scroller.startScroll(getScrollX(), 0, getWidth(), 0, duration);
  90. invalidate();// 刷新
  91. }
  92. /***
  93.      * Menu startScroll(startX, startY, dx, dy)
  94.      * 
  95.      * dx=e1的减去e2的x,所以右移为负,左移动为正 dx为移动的距离,如果为正,则标识向左移动|dx|,如果为负,则标识向右移动|dx|
  96.      */
  97. void slidingMenu() {
  98. Log.e("jj""slidingMenu");
  99. // 没有超过半屏
  100. if (getScrollX() > -getWidth() / 2) {
  101. scroller.startScroll(getScrollX(), 0, -getScrollX(), 0, duration);
  102. isMenuOpned = false;
  103. }
  104. // 超过半屏
  105. else if (getScrollX() <= -getWidth() / 2) {
  106. scroller.startScroll(getScrollX(), 0, -(distance + getScrollX()),
  107. 0, duration);
  108. isMenuOpned = true;
  109. }
  110. invalidate();// 刷新
  111. Log.v("jj""getScrollX()=" + getScrollX());
  112. }
  113. }
  114. abstract class CloseAnimation {
  115. // 点击list item 关闭menu动画
  116. public void closeMenuAnimation() {
  117. };
  118. }

上诉大部分我都加以注释,想必不用我解释太多,大家仔细看都应该可以看懂.

之后我们只需要在MainActivity中把要显示的view添加进去就可以了。

运行效果:

      

我把源码上传网上,大家可以下载运行,如有不足请留言.

说明一点:listview上下左右滑动冲突没有解决,不过我运行看过很多应用,要么listview不能左右滑动,要么能左右滑动但是listview不到一屏.

源码下载

下面我介绍另外一种方法,这种方法比较简单,但是有点不实用.不过对SlidingMenu滑动菜单要求不高的应用完全可以了,如:云中书城等,没有用到手势时时滑动.

实现方法:我们在点击或者滑动的时候获取当前view的切图bitmap,然后将这个bitmap传递到打开后的activity,在这个activity中布局具体如下:

[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/layout"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent" >
  6. <FrameLayout
  7. android:id="@+id/slideout_placeholder"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:background="#777777" >
  11. <ListView
  12. android:id="@+id/list"
  13. android:layout_width="fill_parent"
  14. android:layout_height="fill_parent"
  15. android:cacheColorHint="#00000000" />
  16. </FrameLayout>
  17. <ImageView
  18. android:id="@+id/slidedout_cover"
  19. android:layout_width="fill_parent"
  20. android:layout_height="fill_parent"
  21. android:scaleType="fitXY" />
  22. </AbsoluteLayout>
这种布局目的就是让用户觉得我们操作的是一个view.

具体实现:我将代码上传网上,大家自行下载运行,有不足之处,自行调整.

效果图;



源码下载

这篇讲解比较少,不过大部分都加以注释,相信大家都看得明白.

我看了有的朋友是对HorizontalScrollView进行的自定义,实现方法比较多,因人而异,总之只要实现效果就行.

写到这里,不足的地方请之处,thanks for you .

转载于:https://www.cnblogs.com/fx2008/p/3262620.html

相关文章:

物联网下的数据传输,Python 就能搞定!

作者 | 李秋键责编 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;引言&#xff1a;近几年来&#xff0c;谈起发展最火热的几个关键词必然是人工智能、大数据以及物联网的万物互联、边缘计算等等了。而今天&#xff0c;我们就将利用Python实现物联网下的数据传…

ASP.NET 2.0中Page事件的执行顺序

Page 执行中将按照如下顺序激活事件&#xff1a;Page.PreInitPage.InitPage.InitComplitePage.PreLoadPage.LoadPage.LoadCompletePage.PreRenderPage.PreRenderComplete如果页面从令一个页面继承&#xff0c;如BasePage:System.Web.UI.Page&#xff0c;在BasePage中做了一些扩…

javascript函数嵌套时arguments的问题

疑问&#xff1a; var funtest function () {var fun function (val, val2) {alert(arguments.length); //此处答案&#xff1f; 有些人回答是2&#xff0c;但是正确是 0 };setTimeout(fun, 20);};funtest(); 转载于:https://www.cnblogs.com/huaan011/p/7073792.html

禁用页面缓存的几种方法(静态和动态)

1、在Asp页面首部<head>加入 Response.Buffer True Response.ExpiresAbsolute Now() - 1 Response.Expires 0 Response.CacheControl "no-cache" Response.AddHeader "Pragma", "No-Cache&…

程序员转型AI,成功几率有几分?

技术转型&#xff0c;这两年一直是程序员圈子里的热门话题。对于大部分基层程序员来说&#xff0c;基础岗位上薪资的涨幅很难跟上年龄的增长。而近些年&#xff0c;AI技术发展势头迅猛&#xff0c;优秀人才短缺&#xff0c;这种情况下&#xff0c;无疑是谁先转型&#xff0c;谁…

利用反射实现类的动态加载

为什么80%的码农都做不了架构师&#xff1f;>>> //首先定义一个接口来隔离类&#xff1a; public interface Operator { // public java.util.List act(java.util.List params);public java.util.List act(String content,String content2,java.util.List param…

spring+ (activeMQ) 实现queue与topic

2019独角兽企业重金招聘Python工程师标准>>> 2017-06-17 1、activeMQ下载与安装 前往Apache官网下载ActiveMQ&#xff0c;下载地址http://activemq.apache.org/download.html&#xff08;此处我下载了apache-activemq-5.9.0 版本的tar包&#xff09;解压&#xff1a…

C#文本文件操作

如何向现有文件中添加文本using System;using System.IO;class Test {public static void Main() {// Create an instance of StreamWriter to write text to a file.// The using statement also closes the StreamWriter.using (StreamWriter sw new StreamWriter("Tes…

RISC-V 正在成为芯片世界中的 Linux

【编者按】芯片推动了人类社会数字化、信息化、智能化的发展。从某种程度上来说&#xff0c;芯片技术的发展也影响着行业未来的走向。你觉得未来的芯片世界将会如何&#xff1f;编译 | 虎说八道 责编 | 张文头图 | CSDN 下载自视觉中国出品 | CSDN&#xff08;ID&#xff1a;C…

linux系统小记

1.当某分区空间剩余很大时&#xff0c;可用dd命令写入0&#xff0c;做成很大的文件后格式化&#xff0c;可当作分区使用&#xff08;-o loop挂载&#xff09;#dd if/dev/zero of/wq bs1M count512#mkfs -t ext3 /wq#mkswap /wq#swapon /wq#mount -o loop /wq /data#mou…

网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring

网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3——RPC -- 远程方法调用 及 null的传输 Spring 服务提供商&#xff1a; 1. 配置 rpc03_server.xml 注入 服务提供商 rpcServiceProvider并指定初始化方法 及 服务实例 IUserService 2. 读取 服务消费者 请求的 MethodStaics &…

Rootkit之SSDT hook(通过CR0)

SSDT即System Service Dispath Table&#xff0c;它是一个表&#xff0c;这个表中有内核调用的函数地址。KeServiceDescriptorTable&#xff1a;是由内核&#xff08;Ntoskrnl.exe&#xff09;导出的一个表&#xff0c;这个表是访问SSDT的关键&#xff0c;具体结构是typedef st…

禁止validateRequest的办法

A potentially dangerous Request.Form value was detected from the client (txtTest"<b>"). 由于在.net中&#xff0c;Request时出现有HTML或Javascript等字符串时&#xff0c;系统会认为是危险性值。立马报错。 解决方案一&#xff1a; 在.a…

多画面、实时投票,这场上了一晚热搜的超级晚,背后的技术出圈了

"让观众当导演&#xff0c;自己决定演出顺序&#xff1f;" "不仅直播前台演出&#xff0c;还可以看到候场区明星吃火锅&#xff1f;" 你没听错&#xff0c;在各种直播、晚会频出的岁末年初&#xff0c;最近有一台超级晚出圈了。 1月15日&#xff0c;2021爱…

linux下挂载硬盘

2019独角兽企业重金招聘Python工程师标准>>> 切换到root用户 su - root 查看硬盘信息 fdisk -l Disk /dev/sda: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders Units cylinders of 16065 * 512 8225280 bytes Sector size (logical/ph…

通过创建 HttpCookie 对象的实例编写 Cookie

通过创建 HttpCookie 对象的实例编写 Cookie HttpCookie myCookie new HttpCookie("UserSettings");myCookie["Font"] "Arial";myCookie["Color"] "Blue";myCookie.Expires DateTime.Now.AddDays(1d);Response.Cookies…

亚马逊云服务(AWS)云原生自研处理器首次落地中国区域!

2021年1月28日&#xff0c;亚马逊云服务&#xff08;AWS&#xff09;正式宣布&#xff0c;由 AWS Graviton2 处理器提供支持的 Amazon Elastic Compute Cloud &#xff08;Amazon EC2&#xff09; M6g、C6g 和 R6g 实例已在由光环新网运营的 AWS 中国&#xff08;北京&#xff…

一个古老的问题HashMap与Hashtable区别

HashTable的应用非常广泛&#xff0c;HashMap是新框架中用来代替HashTable的类&#xff0c;也就是说建议使用HashMap&#xff0c;不要使用HashTable。可能你觉得HashTable很好用&#xff0c;为什么不用呢&#xff1f;这里简单分析他们的区别。 1.HashTable的方法是同步的&#…

如何修改可运行Jar包,如何反编译Jar包

将可运行Jar包&#xff0c;反编译成项目&#xff0c;修改代码&#xff0c;再次编译&#xff0c;打包。 需要工具&#xff1a;jd-gui、myeclipse 具体步骤&#xff1a; 1、使用jd-gui打开原始的Jar包&#xff0c;选择File-->Save All Sources&#xff0c;会生成一个zip压缩包…

告别手敲 SQL ?GPT-3 自动帮你写

作者 | Brian Kane SeekWell 编译 | 伍杏玲 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 【导语】手写业务 SQL 很繁琐&#xff1f;GPT-3来帮你&#xff01;本文作者通过手动输入简单的英文描述秒 Get 到 SQL 了。听说 AI 又来抢开发者饭碗&#xff0…

Java IO 体系结构

参考文章地址: http://blog.csdn.net/oracle_microsoft/article/details/2634231 Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2.…

ACCESS数据库防止下载

1. 修改数据库名。这是常用方法&#xff0c;将数据库名该成怪异名字或长名字&#xff0c;以防别人猜测。一旦被人猜到&#xff0c;别人还是能下载数据库文件&#xff0c;但几率不大。如将数据库database.mdb改成dslfjds$^&ijjkgf.mdb等 2. 修改数据库后缀。一般改成databa…

CentOS 7 SSH 免密登录的方法

先决条件 3 台 CentOS 7 HOSTNAMEIPROLEserver110.8.26.197Masterserver210.8.26.196Slave1server310.8.26.195Slave21. 用 root 用户登录。每台服务器都生成公钥&#xff0c;再合并到 authorized_keys。 2. CentOS 默认没有启动 ssh 无密登录&#xff0c;去掉 /etc/ssh/sshd_c…

webconfig加密

退到根目录 cd/跳到某盘 c: ..跳到某目录 cd Documents and Settings/All Users上一层 cd .. cd WINDOWS/Microsoft.NET/Framework/v2.0.50727 回车 aspnet_regiis -pef connectionStrings D:/NET aspnet_regiis -pe connectionStrings -app /NET 虚拟目录aspnet_regiis -pd…

WIN7 任务栏放右侧 有个BUG

不能变窄啊&#xff0c;微软又在设计上。转载于:https://www.cnblogs.com/whitetiger/p/3269827.html

全领域通吃,12个经典Python数据可视化库盘点

责编 | 寇雪芹头图 | 下载于视觉中国来源 | 博文视点BroadviewPython有很多数据可视化库&#xff0c;这些数据可视化库主要分为探索式可视化库和交互式可视化库。前者透过简单直接的视觉图形&#xff0c;更方便用户看懂原数据&#xff0c;后者主要用于与业务结合过程中展现总体…

add nodes to the swarm

一旦你们创建了一个带有管理节点的swarm集群&#xff0c;你就可以开始添加 worker节点$ docker-machine ssh worker1 $ docker swarm join \--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \192.168.99.100:2377 This node …

三种方法,用Python轻松提取PDF中的全部图片

作者 | 陈熹、刘早起来源 | 早起Python头图 | 下载于视觉中国有时我们需要将一份或者多份PDF文件中的图片提取出来&#xff0c;如果采取在线的网站实现的话又担心图片泄漏&#xff0c;手动操作又觉得麻烦&#xff0c;其实用Python也可以轻松搞定&#xff01;今天就跟大家系统分…

ASP.NET中如何防范SQL注入式攻击

1将sql中使用的一些特殊符号&#xff0c;如 -- /* ; %等用Replace()过滤&#xff1b;2限制文本框输入字符的长度&#xff1b;3检查用户输入的合法性&#xff1b;客户端与服务器端都要执行&#xff0c;可以使用正则。4使用带参数的SQL语句形式。 ASP.NET中如何防范SQL注入式攻击…

iOS下的类似Android的toast提示

一般人会说&#xff0c;就是用那个MBProgressHUD不就行了吗&#xff1f; 的确是&#xff0c;MBProgressHUD能为我们做了好多loading指示器&#xff0c;但是toast不一样&#xff0c;它是在屏幕某个地方出现一行小提示&#xff0c;例如网络状态&#xff0c;出现的时候不会妨碍用户…