- 浏览: 249089 次
- 性别:
- 来自: 湖南
最新评论
-
KANGOD:
android:overScrollMode="ne ...
去掉ScrollVIew拉到尽头时再拉的阴影效果 -
yangsongjing:
comsci 写道非常感谢.....希望大家的代码和文档都能够 ...
java DES 加密解密 算法 -
comsci:
非常感谢.....
希望大家的代码和文档都能够用一种简单的方 ...
java DES 加密解密 算法 -
yangsongjing:
不过2.3以下的版本没这个方法怎么解决啊?
去掉android scrollview滚动到顶部继续滚会出现一个渐变的颜色块 -
yangsongjing:
setOverScrollMode(View.OVER_SCR ...
去掉android scrollview滚动到顶部继续滚会出现一个渐变的颜色块
用于项目中可能要用到此功能,于是就看了下相关代码,发现网上很多人的实现方式都是fragment和FrameLayout,但是看了后感觉都太麻烦了,于是我自己试着写了下,具体实现方式是一个页面两个VIew,一个作为菜单开始隐藏起来,一个作为展示页面,监听用户手势,在显示之前播放一个平移动画,隐藏也是如此,其他操作就和一个页面一样了,没什么区别能够很轻松的监听用户各种操作,出来打开和隐藏的时候稍有逊色之外其他的都要流畅一点。当然这是作为一个懒人的做法,哈哈。
动画代码:
TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);
布局就是两个layout 水平并列,考虑适配机型 设置weight的值即可。就不上代码了
界面对应activity完整代码
public class TestActivity extends Activity
implements BookListFragment.Callbacks,OnTouchListener,OnGestureListener {
GestureDetector detector;
public TestActivity() {
detector = new GestureDetector(this);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载/res/layout目录下的activity_book_twopane.xml
setContentView(R.layout.activity_book_twopane);
LinearLayout tv = (LinearLayout) findViewById(R.id.linearLayout);
//设置tv的监听器
tv.setOnTouchListener(this);
tv.setFocusable(true);
//必须,view才能够处理不同于Tap(轻触)的hold
tv.setClickable(true);
tv.setLongClickable(true);
detector.setIsLongpressEnabled(true);
detector.setIsLongpressEnabled(true);
findViewById(R.id.book_list).setVisibility(View.GONE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_test_fragment, menu);
return true;
}
//实现Callbacks接口必须实现的方法
@Override
public void onItemSeleted(int id) {
//创建Bundle对象,准备向Fragment传入参数
Bundle arguments = new Bundle();
arguments.putInt(BookDetailFragement.ITEM_ID, id);
//创建BookDetailFragment对象
BookDetailFragement fragment = new BookDetailFragement();
//向Fragment中传入参数
fragment.setArguments(arguments);
//使用fragment替换book_detail_container容器当前显示的Fragment
getFragmentManager().beginTransaction()
.replace(R.id.book_detail_container, fragment).commit();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
// Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// 参数解释:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
// 触发条件 :
// X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling left
// Toast.makeText(this, "Fling Left", Toast.LENGTH_SHORT).show();
TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);
// findViewById(R.id.book_list).setVisibility(View.GONE);
} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling right
// Toast.makeText(this, "Fling Right", Toast.LENGTH_SHORT).show();
findViewById(R.id.book_list).setVisibility(View.VISIBLE);
TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);
} else if(e2.getY()-e1.getY()>FLING_MIN_DISTANCE && Math.abs(velocityY)>FLING_MIN_VELOCITY) {
// Fling down
// Toast.makeText(this, "Fling down", Toast.LENGTH_SHORT).show();
} else if(e1.getY()-e2.getY()>FLING_MIN_DISTANCE && Math.abs(velocityY)>FLING_MIN_VELOCITY) {
// Fling up
// Toast.makeText(this, "Fling up", Toast.LENGTH_SHORT).show();
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show();
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();
return true;
}
@Override
public void onShowPress(MotionEvent e) {
// Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();
return true;
}
}
动画代码:
TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);
布局就是两个layout 水平并列,考虑适配机型 设置weight的值即可。就不上代码了
界面对应activity完整代码
public class TestActivity extends Activity
implements BookListFragment.Callbacks,OnTouchListener,OnGestureListener {
GestureDetector detector;
public TestActivity() {
detector = new GestureDetector(this);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载/res/layout目录下的activity_book_twopane.xml
setContentView(R.layout.activity_book_twopane);
LinearLayout tv = (LinearLayout) findViewById(R.id.linearLayout);
//设置tv的监听器
tv.setOnTouchListener(this);
tv.setFocusable(true);
//必须,view才能够处理不同于Tap(轻触)的hold
tv.setClickable(true);
tv.setLongClickable(true);
detector.setIsLongpressEnabled(true);
detector.setIsLongpressEnabled(true);
findViewById(R.id.book_list).setVisibility(View.GONE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_test_fragment, menu);
return true;
}
//实现Callbacks接口必须实现的方法
@Override
public void onItemSeleted(int id) {
//创建Bundle对象,准备向Fragment传入参数
Bundle arguments = new Bundle();
arguments.putInt(BookDetailFragement.ITEM_ID, id);
//创建BookDetailFragment对象
BookDetailFragement fragment = new BookDetailFragement();
//向Fragment中传入参数
fragment.setArguments(arguments);
//使用fragment替换book_detail_container容器当前显示的Fragment
getFragmentManager().beginTransaction()
.replace(R.id.book_detail_container, fragment).commit();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
// Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// 参数解释:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
// 触发条件 :
// X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling left
// Toast.makeText(this, "Fling Left", Toast.LENGTH_SHORT).show();
TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);
// findViewById(R.id.book_list).setVisibility(View.GONE);
} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling right
// Toast.makeText(this, "Fling Right", Toast.LENGTH_SHORT).show();
findViewById(R.id.book_list).setVisibility(View.VISIBLE);
TranslateAnimation translate = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translate.setDuration(1000);
findViewById(R.id.book_list).startAnimation(translate);
} else if(e2.getY()-e1.getY()>FLING_MIN_DISTANCE && Math.abs(velocityY)>FLING_MIN_VELOCITY) {
// Fling down
// Toast.makeText(this, "Fling down", Toast.LENGTH_SHORT).show();
} else if(e1.getY()-e2.getY()>FLING_MIN_DISTANCE && Math.abs(velocityY)>FLING_MIN_VELOCITY) {
// Fling up
// Toast.makeText(this, "Fling up", Toast.LENGTH_SHORT).show();
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show();
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();
return true;
}
@Override
public void onShowPress(MotionEvent e) {
// Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();
return true;
}
}
发表评论
-
ios公司账号申请流程记录
2020-08-04 17:04 3601.注册APPLE ID 2.填写公司信息,申请邓白氏码(企业 ... -
获取sha1
2018-07-18 16:03 674keytool -list -v -keystore /Use ... -
获取手机通话记录
2017-11-30 17:28 0/** * 读取数据 * * @ ... -
安卓打包加固自动化
2017-06-03 15:10 0惠农安卓打包后远程加固(阿里服务)支持工具: 由于远程调用阿里 ... -
阿里百川HotFix接入指南
2017-04-11 14:46 1561阿里百川HotFix接入指南 1.首先需要成为阿里开放平台的开 ... -
android 6.0权限
2016-08-29 08:44 627从Android 6.0开始, 用户需要在运行时请求权限, 本 ... -
2016 的一些android新技术
2016-08-04 16:31 426转:2016你需要了解Android有以下新兴的技术与框架,有 ... -
安卓应用每次从后台切换到前台都会启动欢迎界面的问题
2016-07-15 09:18 2810问题描述: 应用安装后,通过安装界面的打开按钮打开应用,每当应 ... -
android性能分析工具整理
2016-03-28 22:57 723原文链接:http://www.jians ... -
android 技术经验归纳
2016-03-28 22:54 5191.android基于java,java的抽象封装要会用,并且 ... -
android面试提问
2015-11-16 11:54 0一。登录过程中需要取消登录 怎么中断连接 1)如果用httpc ... -
android 集成百度地图路线规划
2015-05-26 11:21 8951.创建应用 包名需和应用一致 2.还需要填写安全码 = sh ... -
android 手机判断是否在充电 如断电自动打电话提醒功能
2015-05-18 11:14 3330public class MainActivity exten ... -
ANDROID应用安全防御
2015-04-02 10:06 1282Android应用的安全隐患包括三个方面:代码安全、数据安全和 ... -
Fragment加入Pagerview效果
2015-04-01 14:50 495转自 http://www.eoeandroid.com/t ... -
android性能优化
2015-03-30 10:59 24061.采用硬件加速,在androidmanifest.xml ... -
设计模式记忆方法(转)
2015-03-11 10:20 871设计模式的分类 创建型。 情景记忆:两个人在聊天。 ... -
android 数据库版本升级
2015-03-03 16:41 741数据库升级的意义 我 ... -
java 23种设计模式示例代码集合
2015-02-09 09:40 713策略模式,建造者模式,简单工厂模式,单例模式,抽象工厂模式 ... -
ios本地数据存储
2014-08-22 16:21 830在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题 ...
相关推荐
在Android应用开发中,...总之,实现Android侧边栏效果需要对手势检测、布局设计、动画以及状态管理有深入理解。通过"TestSideShowApp"实例,你可以看到这些知识点是如何结合在一起的,从而提升自己的Android开发技能。
本文将深入探讨Android侧边栏滑动的实现原理,并基于提供的两个源码进行解析。 首先,Android侧边栏滑动主要依赖于手势检测和布局动画。在Android SDK中,我们可以使用`GestureDetector`类来检测用户的滑动手势,...
本文将深入探讨如何在Android中实现侧边栏滑动的效果。 首先,实现侧边栏滑动的关键组件是`NavigationView`,它是Android Support Library中的一个视图组件。`NavigationView`设计用于放置在`DrawerLayout`的左侧,...
开发者可以根据自己的项目特点选择合适的效果,或者通过研究这些实例来学习如何实现自定义的侧边栏效果。 1. **基础侧边栏实现**:这是最简单的侧边栏实现,通常基于`NavigationView`组件,配合`DrawerLayout`来...
侧边栏效果实现的关键在于触摸事件的处理和视图的平滑过渡。在Android开发中,可以使用SlidingPaneLayout或者DrawerLayout来实现这一效果。这两个布局组件都是Android SDK提供的,用于构建可滑动的侧边栏。...
本教程将重点讲解如何利用Fragment来实现一个简单的侧边栏。 首先,理解Fragment的基本概念是非常重要的。Fragment有自己的生命周期,并且可以独立于Activity进行操作。通常,Fragment包含一个UI布局,并且可以与...
本资源“ce_java_android各种侧面_测边栏样式_android_源码”提供了多种不同风格的侧边栏实现,旨在帮助开发者了解并实现丰富的侧边栏效果。下面将详细解析这些知识点。 1. **Android原生风格侧边栏样式** Android...
Swift-LMSideBarController是专为iOS开发者设计的一个轻量级组件,它提供了便捷的方式来实现类似Android或许多桌面应用中的侧滑菜单效果。这个库由Luming Min开发,并且基于Swift编程语言,使得iOS应用能够拥有美观...
总结来说,Android ResideMenu是一个强大的工具,可以帮助开发者轻松实现类似iOS的侧边栏滑动效果。通过简单的集成和配置,你可以为Android应用带来更加优雅的用户体验。记住,设计良好的用户界面对于任何应用的成功...
7. **测试与优化**:在不同设备和Android版本上测试应用,确保侧边栏效果的稳定性和一致性。根据反馈进行调整,优化滑动流畅度和视觉效果。 通过以上步骤,我们可以使用ListView和DrawableLayout轻松创建一个功能...
总结来说,AndroidResideMenu是一个强大的工具,它简化了Android应用开发中侧边栏功能的实现,同时提供了丰富的动画效果和高度的可定制性。开发者可以通过这个库,为自己的应用增添一份独特的魅力,提升用户的使用...
3. **手势识别**:Android系统支持滑动手势,`DrawerLayout`能够监听并处理这些手势,使得用户可以通过简单的滑动操作打开和关闭侧边栏。 4. **菜单资源**:侧边栏的内容通常通过XML菜单资源定义,位于`res/menu/`...
首先,侧边栏(SlidingMenu)是Android应用中常用的一种滑动菜单效果,它通常隐藏在主屏幕的左侧或右侧,通过滑动屏幕边缘可以将其拉出。SlidingMenu库提供了一种简单的方法来实现这种效果。它支持自定义菜单内容,...
在这个“安卓SlidingMenu各种菜单侧滑菜单相关-Android实现过目难忘的侧边栏slideMenu效果.rar”压缩包中,包含了实现此类功能的相关代码和资源,可能包括自定义布局、动画效果和事件处理等方面的知识。 首先,我们...
为了实现滑动时弹出侧边栏的效果,我们需要在Activity中添加手势检测。可以使用`GestureDetector`和`SwipeRefreshLayout`等组件,或者自定义滑动手势监听。例如,使用 GestureDetector 的简单实现: ```java ...
接下来,我们将深入探讨如何使用这两个组件来实现一个炫酷的侧边栏。 首先,ToolBar是Android Design Support Library中的一个控件,它提供了Material Design风格的Action Bar。在布局文件中,你可以通过<androidx....
总的来说,"03-01 侧边栏SlidingDemo"是一个关于如何在Android应用中实现抽屉式导航菜单的实例。通过学习这个示例,开发者可以掌握使用`DrawerLayout`、`ActionBarDrawerToggle`以及其他相关组件和技术来构建具有侧...
在Android开发中,创建具有可切换Tab和滑出侧边栏的用户界面是常见的需求,尤其是在构建复杂的移动应用时。这个源码示例是关于如何使用`Fragment`和相关组件来实现这一功能的实践教程。下面我们将深入探讨相关知识点...
在“NavigationDraw_Circleimg侧边栏圆形头像动态图标”这个项目中,开发者对Android Studio内置的Navigation Drawer Activity进行了自定义改造,实现了更加美观且具有交互反馈效果的界面元素。 首先,我们将讨论...