Android上拉查看详情实现
京东淘宝有那么一种效果就是,上拉能够查看宝贝的详情,这里我也实现了一个类似的效果,也能够移植到商业项目上:先看看简单的效果图
实现原理事实上是利用了ScrollView的滚动和view的touch事件监听完毕的:图片层(也能够是其它布局)和详情页层事实上是从上到下布局到ScrollView中的,首先要屏蔽ScrollView的touch事件,然后初始化的时候给上层设置为屏幕的高度,详情页设置高度为屏幕高度 - 状态栏高度 - 上层灰色提示信息的高度。再给图片层加入touch事件。获取手指移动的距离,当达到一定的距离就上滑或下滑,否则就回弹回去。就是这么简单 哈哈
一:自己定义ScrollView屏蔽touch事件(不然,图片层不能监听到touch事件)
package com.ywl5320.scrollanima; import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView; public class MyScrollView extends ScrollView { private OnScrollChangedListeneer onScrollChangedListeneer;// 滚动监听接口 public MyScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
} public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
} public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
} @Override
public boolean onTouchEvent(MotionEvent ev) { // 屏蔽touch事件,才干在监听其子控件的touch事件
// TODO Auto-generated method stub
super.onTouchEvent(ev);
return false;
} @Override
public boolean onInterceptTouchEvent(MotionEvent event)// 屏蔽touch事件传递,才干在监听其子控件的touch事件
{
super.onInterceptTouchEvent(event);
return false;
} @Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
// TODO Auto-generated method stub
super.onScrollChanged(l, t, oldl, oldt);
if(onScrollChangedListeneer != null)
{
onScrollChangedListeneer.onScrollChanged(l, t, oldl, oldt);
}
} // 滚动事件监听。获取滚动的距离。用户处理一些其它事
public interface OnScrollChangedListeneer
{
public void onScrollChanged(int l, int t, int oldl, int oldt);
} public void setOnScrollChangedListeneer(OnScrollChangedListeneer onScrollChangedListeneer)
{
this.onScrollChangedListeneer = onScrollChangedListeneer;
} }
这里屏蔽touch事件的同一时候。还为滚动事件加入了一个回调接口,方便在使用的时候获取滚动的状态。以实现其它须要的效果。
二:动态设置图片层和详情页的高度
// 设置滑动层为屏幕高度
LayoutParams lp = (LayoutParams) lyView.getLayoutParams();
screenHeight = measureHeight();
lp.height = screenHeight;
lyView.setLayoutParams(lp); // 设置具体层的高度:等于屏幕高度-状态栏高度-阴影提示高度
LayoutParams lp2 = (LayoutParams) swipeRefreshLayout.getLayoutParams();
lp2.height = screenHeight - dip2px(MainActivity.this, 150)
- getStatusBarHeight();
swipeRefreshLayout.setLayoutParams(lp2);
用到的工具方法:
/**
* 获取屏幕高度
*
* @return
*/
public int measureHeight() {
WindowManager wManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wManager.getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
} /**
* dip转换为px
*
* @param context
* @param dipValue
* @return
*/
public int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
} /**
* 获取状态栏高度
*
* @return
*/
private int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height",
"dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
初始化工作就完毕了
三:为图片层加入touch事件
// 为上层加入touch事件,控制详情页显示隐藏
lyView.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
int offsety = 0;
int y = 0;
switch (action) {
case MotionEvent.ACTION_DOWN:
point.y = (int) event.getRawY();
offsetsum = 0;
// System.out.println(event.getX() + "----------" + event.getY());
break;
case MotionEvent.ACTION_MOVE:
y = (int) event.getRawY();
offsety = y - point.y;
offsetsum += offsety;
point.y = (int) event.getRawY();
sv.scrollBy(0, -offsety);
// System.out.println("offsetnum:" + offsetsum);
break;
case MotionEvent.ACTION_UP:
if (offsetsum > 0) {// offsetsum大于0时是往下拉。仅仅有当显示详情页是下拉才有效果,所以这里先推断isOpen的值。 if (isOpen) {
if (offsetsum > 300) {
sv.smoothScrollTo(0, 0);
isOpen = false;
} else {
sv.smoothScrollTo(0, screenHeight);
isOpen = true;
}
}
else
{
sv.smoothScrollTo(0, 0);
isOpen = false;
}
} else {// offsetsum小于0时是往上拉,仅仅有当隐藏详情页是下拉才有效果,所以这里先推断isOpen的值。
if(!isOpen)
{
if (offsetsum < -300) {
sv.smoothScrollTo(
0,
screenHeight
- dip2px(MainActivity.this, 150));
isOpen = true;
} else {
sv.smoothScrollTo(0, 0);
isOpen = false;
}
}
else
{
sv.smoothScrollTo(
0,
screenHeight
- dip2px(MainActivity.this, 150));
isOpen = true;
} } break;
}
return true;
}
});
首先推断当前是否显示详情页。然后依据手指移动距离是否大于0,推断是向上(小于0)还是向下(大于0)滑动。当滑动了一定的距离后就运行滑动操作,利用ScrollView的smoothScrollTo方法动态的滑动到指定位置。注意:touch-move滑动时不要用smoothScrollTo这种方法。会导致Up时smoothScrollTo没有效果(我想应该是move时的动画监听还没有完毕,up是就没有加入成功动画的监听,导致up是smoothScrollTo没有效果,而是直接到了某一点)。
这就实现了上拉查看详情和下拉隐藏详情页的效果。
效果图中用到了一个下拉刷新的组件是v4包里的SwipeRefreshLayout控件。这个非常好用的,大家能够试试哦。好了就到这里了:Demo下载地址
Android上拉查看详情实现的更多相关文章
- android仿京东、淘宝商品详情页上拉查看详情
话不多说,直接上干货,基本就是一个scrollview中嵌套两个scrollview或者webview;关键点事处理好子scrollview和父scrollview的触摸.滑动事件已达到想要的效果.大 ...
- 转::iOS 仿淘宝,上拉进入详情页面
今天做的主要是一个模仿淘宝,上拉进入商品详情的功能,主要是通过 tableView 与 webView 一起来实现的,当然也可根据自己的需要把 webView 替换成你想要的 // // ViewCo ...
- Android 上拉加载更多功能
前几天看了github上面的例子,参照它的实现,自己又稍微改了一点,往项目里面增加了一个上拉加载更多功能.具体的实现如下: 首先要重写ListView: import android.content. ...
- 移动端web页面列表类上拉加载,查看详情,iframe嵌套第三方页面遇到的问题以及解决办法
1.移动端上拉加载 网上有很多成熟的插件,比如iscroll.在这里介绍一下用jquery和js写的上拉加载方法.使用原生的去写上拉加载更多需要三个高度去做对比,以新闻类列表举例,首先需要整个dom的 ...
- Android仿淘宝继续上拉进入商品详情页的效果,使用双Fragment动画切换;
仿淘宝继续上拉进入商品详情页的效果,双Fragment实现: 动画效果: slide_above_in.xml <?xml version="1.0" encoding=&q ...
- android使用PullToRefresh实现上拉加载和下拉刷新效果
其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...
- 让Android Support V4中的SwipeRefreshLayout支持上拉载入很多其它
前言 原来的Android SDK中并没有下拉刷新组件,可是这个组件确实绝大多数APP必备的一个部件.好在google在v4包中出了一个SwipeRefreshLayout.可是这个组件仅仅支持下拉刷 ...
- android 自定义scrollview 仿QQ空间效果 下拉伸缩顶部图片,上拉回弹 上拉滚动顶部title 颜色渐变
首先要知道 自定义scrollview 仿QQ效果 下拉伸缩放大顶部图片 的原理是监听ontouch事件,在MotionEvent.ACTION_MOVE事件时候,使用不同倍数的系数,重置布局位置[ ...
- Android PullToRefresh (GridView 下拉刷新上拉加载)
做这个需要自己去git hub上下载个pull-to-refresh 里面有个library为依赖包自己导到自己的项目中 (下载地址:https://github.com/chrisbanes/And ...
随机推荐
- (转)淘淘商城系列——使用maven tomcat插件启动web工程
http://blog.csdn.net/yerenyuan_pku/article/details/72672138 上文我们一起学习了怎样搭建maven工程,这篇文章我就来教大家一起学习怎样用to ...
- Kotlin:数组、字符串模板
一.数组 Kotlin 中的数组是带有类型参数的类,其元素类型被指定为相应的类型参数,使用 Array 类来表示, Array 类定义了 get 与 set 函数(按照运算符重载约定这会转变为 [ ] ...
- 【Lucene】实现全文索引
2. Lucene 实现全文检索的流程2.1.索引和搜索流程图 绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:确定原始内容即要搜索的内容 -> 采集文档 -> ...
- swiper实现响应式全屏自动轮播
html: <!--轮播 --> <div class="Excellent_swi"> <div class="swiper-contai ...
- react-native Socket Event 在控制台的输出
在XCode中运行react-native 的时候,避免不了的要查看日志信息 ,但是react-native中的Socket的日志简直是太多了,往往是刚看到自己想要看到的信息的时候,瞬间就被最新的日志 ...
- ajax 传参数 数组 会加上中括号
解决办法 1,由于版本过高导致 我用的是1.9版本 2, 有三种选择. 一种是JSON.stringify([1,2,3]),到后端再解析. 另外一种是后端的接受的contentType改成appli ...
- linux netstat-查看Linux中网络系统状态信息
博主推荐:更多网络测试相关命令关注 网络测试 收藏linux命令大全 netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况. 语法 netstat(选项) ...
- Volume 1. String(uva)
10361 - Automatic Poetry #include <iostream> #include <string> #include <cstdio> # ...
- 创建Tensor
目录 创建Tensor numpy, list numpy list zeros, ones, fill zeros ones fill random 打乱idx后,a和b的索引不变 constant ...
- 关于Python构建微服务的思考(一)
一:什么是微服务? 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成. 系统中的各个微服务可被独立部署,各个微服务之间是松耦合的. 每个微服务仅关注于完成一件任务并很好地完成该任务. ...