- 浏览: 244028 次
- 性别:
- 来自: 湖南
最新评论
-
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 3341.注册APPLE ID 2.填写公司信息,申请邓白氏码(企业 ... -
获取sha1
2018-07-18 16:03 638keytool -list -v -keystore /Use ... -
获取手机通话记录
2017-11-30 17:28 0/** * 读取数据 * * @ ... -
安卓打包加固自动化
2017-06-03 15:10 0惠农安卓打包后远程加固(阿里服务)支持工具: 由于远程调用阿里 ... -
阿里百川HotFix接入指南
2017-04-11 14:46 1512阿里百川HotFix接入指南 1.首先需要成为阿里开放平台的开 ... -
android 6.0权限
2016-08-29 08:44 603从Android 6.0开始, 用户需要在运行时请求权限, 本 ... -
2016 的一些android新技术
2016-08-04 16:31 392转:2016你需要了解Android有以下新兴的技术与框架,有 ... -
安卓应用每次从后台切换到前台都会启动欢迎界面的问题
2016-07-15 09:18 2715问题描述: 应用安装后,通过安装界面的打开按钮打开应用,每当应 ... -
android性能分析工具整理
2016-03-28 22:57 673原文链接:http://www.jians ... -
android 技术经验归纳
2016-03-28 22:54 4741.android基于java,java的抽象封装要会用,并且 ... -
android面试提问
2015-11-16 11:54 0一。登录过程中需要取消登录 怎么中断连接 1)如果用httpc ... -
android 集成百度地图路线规划
2015-05-26 11:21 8181.创建应用 包名需和应用一致 2.还需要填写安全码 = sh ... -
android 手机判断是否在充电 如断电自动打电话提醒功能
2015-05-18 11:14 3330public class MainActivity exten ... -
ANDROID应用安全防御
2015-04-02 10:06 1238Android应用的安全隐患包括三个方面:代码安全、数据安全和 ... -
Fragment加入Pagerview效果
2015-04-01 14:50 459转自 http://www.eoeandroid.com/t ... -
android性能优化
2015-03-30 10:59 23451.采用硬件加速,在androidmanifest.xml ... -
设计模式记忆方法(转)
2015-03-11 10:20 833设计模式的分类 创建型。 情景记忆:两个人在聊天。 ... -
android 数据库版本升级
2015-03-03 16:41 701数据库升级的意义 我 ... -
java 23种设计模式示例代码集合
2015-02-09 09:40 671策略模式,建造者模式,简单工厂模式,单例模式,抽象工厂模式 ... -
ios本地数据存储
2014-08-22 16:21 786在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题 ...
相关推荐
在Android应用开发中,滑动侧边栏经常使用,今天我也试着自己进行了一个简单的实践,虽然功能还不是很强大,但是可以保留下来为以后的开发使用,有需要时在进行简单的修改。实现一个滑动侧边栏思路也很简单: 1....
首要的自然是需要继承View绘制出侧边栏,并向外提供一个监听字母索引变化的方法 /** * 作者:叶应是叶 * 时间:2017/8/20 11:38 * 描述: */ public class LetterIndexView extends View { public interface ...
根据图片分析,要实现的有侧边栏DrawerLayout,ActionBar的颜色和菜单以及ActionBarDrawerToggle的动画效果. 在这之前,Theme要改成带有ActionBar的主题 android:theme=@android:style/Theme.Holo.Light 一:侧边栏-...
侧边栏是Android应用中很常见的一个界面效果(抽屉效果)。而利用DrawerLayout实现右侧栏是相对简单的。而且这个控件自带滑动效果,十分方便。 DrawerLayout属于android-support-v4.jar的包的内容,sdk新的就不用...
主要包括功能:引导页 侧边栏 城市选择 侧滑删除列表项 网络请求 目前用到的一些开源库。 Volley Google I/O 2013推出的官方网络请求库,请求快速,使用方便,易于扩展,而且支持图片异步加载。 ...
[四次元]基于Fragment实现Tab的切换,滑出侧边栏.zip [四次元]封装的一个tabhost框架.zip [四次元]带密码登陆的密码保险箱.zip [四次元]标签式布局吧.zip [四次元]模仿乐动力介绍页面第一屏动画效果.zip [四次元]...
asmack包是用于和openfile服务器通讯的,也是smack的封装jar包; qq表情最简单的实现; 类似qq聊天的列表以及背景; 实现类似qq侧边栏效果,并且可以多页面滑动,viewpage双层
图5从左滑出侧边栏可以选择其他城市。如果是非首次启动,则显示上次选择的城市天气预报界面(比如退出时显示广州的天气预报界面即图4,再次进入时仍显示该界面)。 具体app功能实现: 1.获取全国城市列表(图1到图3) ...
android_news_app 使用方法:将全部项目导入,右键fast-easy-reader 选择buid path ->config Buid Path,选择Android,将需要的库添加,clean一下运行。
SimpleSlidingMenu(一个简单的滑动侧边栏,支持三种模式,支持自定义) SimplePointView(一个模仿QQ小红点拖动效果的控件) SimpleViewPager(模仿support-v4包中ViewPager的实现,里面描述了ViewPager的主要实现原理) ...