android滚动布局
Ⅰ Android实现横纵滚动标题不动框架
用自定义标题栏。
用自定义标题栏,只要把系统自带的标题栏去掉就行。做法:requestWindowFeature(Window.FEATURE_NO_TITLE),自己再写两个布局块(LinearLayout布局)充当顶部和底部的标题栏即可,中间使用ScrollView即可完成。
如果应用需要添加水平滚动条,则可借助于另一个滚动视图HorizontalScrollView来实现。
Ⅱ Android上这种布局和联动的滑动效果是怎么做到的
CoordinatorLayout+AppBar,desgin包里的。正确的做法就是自己处理滑动事件。建议先了解一下View的事件传递机制。这个问题我遇到过,写了个viewgroup解决这个问题。scrollview里面放viewpager,布局的时候手动设置viewpager的高度。viewpager的指示器做两个,一个放scrollview里面,一个放scrollview外面。
老版本的网易云音乐 曾经用过这个效果。以前实现过这样的效果。ViewPager顶部有一个Layout。下面ViewPager中的每个ListView有一个空白的Header当前页面上下滑动的时候动态的根据Y值去改变顶部的Layout的Y值。当页面左右滑动完成之后, 根据当前ListView的Y值.重新丝滑的改变顶部Layout的Y值。现在有个开源项目也能实现类似的效果。
Ⅲ 【转】Android软键盘的全面解析
软键盘其实是一个Dialog
InputMethodService为我们的输入法创建了一个Dialog,并且对某些参数进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统会对当前的主窗口进行调整,以便留出相应的空间来显示该Dialog在底部,或者全屏。
其实这段话我们经常在各种软键盘博客所看到,但是大家并不知道Android是怎么为我们创建的这个Dialog,所以我先带大家来看下软键盘生成这块的源码,了解软键盘的生成流程。
我们先来看一下InputMethodService的继承关系:
因为InputMethodService属于服务,接下来我们先看一下服务的入口onCreate()方法:
通过上面的分析,我们怀疑这里的SoftInputWindow是软键盘弹出创建的Dialog对象,下面我们看下SoftInputWindow的源码。
看到这里大家就能明白了,为什么说软键盘就是一个Dialog。而且这里通过设置Gravity.BOTTOM来控制当前Dialog在Window中的位置。
在Android中,可以通过给Activity设置 windowSoftInputMode 这个属性来控制软键盘与Activity的主窗口的交互方式。
Activity 的主窗口与包含屏幕软键盘的窗口的交互方式,该属性的设置影响两个方面:
该设置必须是下面所列的值之一,或者是一个“state…”值加上一个“adjust…”值的组合,在任一组中设置多个值(例如,多个“state…”值)都会产生未定义结果。各值之间使用垂直条 (|) 分隔。
下面将通过例子来介绍 adjustNoting 、 adjustUnspecified 、 adjustResize 、 adjustPan 在软键盘弹出的区别:
非滚动布局xml
点击最下面的EditText12
滚动布局xml
通过上面的例子,我们可以完全理解adjust系列的各个参数的作用。而软键盘的显示和隐藏这里面需要并不多,而且内容并不算复杂,大家回去自己尝试下就可以。
在日常开发中,如果需要将软键盘的Enter键更改为其他键,可以设置其 android:imeOptions 属性,这个属性可以控制软键盘的Enter键,以及横屏情况下的软键盘显示状态。
该设置必须是下面所列的值之一,或者是一个“action…”值加上一个“flag…”值的组合,在action…组中设置多个值(例如,多个“action…”值)都会产生未定义结果,而flag….可以设置多个。各值之间使用垂直条 (|) 分隔
控制软键盘上的Enter键
横屏下控制软键盘
总结一下:
这里大部分的属性,已经介绍完毕,如果英语好的同学,可以去看下官方文档,可以更好的理解,并且本文以搜狗输入法为实践,可能其他的输入法与其显示的不同,但是功能应该都是一样的。
而如果要在横屏状态不希望软键盘全屏显示最好是将flagNoFullscreen和flagNoExtractUi结合使用,这样体验上会更好
android:imeOptions=”flagNoFullscreen|flagNoExtractUi”
Android官网的Api
如果需要监听软键盘的右下角的按键,需要为EditText设置setOnEditorActionListener()监听:
上面的方式,只是展示了如何监听各个按键的方法,如果需要消费事件,则需要return true。
(1)第一次写这么长的博客,感觉会有一些不足,各位看官如果有不合理的地方,或者有误的地方请直接指出。
(2)本来想整理成一个Demo的,后来简单看来下,该有的几乎都贴出来了,有需要的可以按需复制就可以。
(3)写完这篇博客之后,感觉博客干货还是不多,所以定位这篇文章算是总结性质加上实际案例性质的博客。
(4)Android软键盘的总结就差不多到这里,希望各位看官,如果看到这里有收获,就点点赞,灌灌水,顶一波,这样博主才有写下去的动力。
(5)感谢小辉同学的校验,调整了文章中不通顺的地方。
1.彻底搞定Android开发中软键盘的常见问题
http://blog.csdn.net/mynameishuangshuai/article/details/51567357
2.Android UI(EditText)详解
http://blog.csdn.net/qq_28057577/article/details/51919965?locationNum=12&fps=1
3.微信软键盘布局闪动问题
https://blog.dreamtobe.cn/2015/09/01/keyboard-panel-switch/
Ⅳ android 下拉滚动页面怎么实现
以下是我自己花功夫编写了一种非常简单的下拉刷新实现方案,现在拿出来和大家分享一下。相信在阅读完本篇文章之后,大家都可以在自己的项目中一分钟引入下拉刷新功能 最近项目中需要用到ListView下拉刷新的功能,一开始想图省事,在网上直接找一个现成的,可是尝试了网上多个版本的下拉刷新之后发现效果都不 怎么理想。有些是因为功能不完整或有Bug,有些是因为使用起来太复杂,十全十美的还真没找到。因此我也是放弃了在网上找现成代码的想法,自己花功夫编写 了一种非常简单的下拉刷新实现方案,现在拿出来和大家分享一下。相信在阅读完本篇文章之后,大家都可以在自己的项目中一分钟引入下拉刷新功能。 首先讲一下实现原理。这里我们将采取的方案是使用组合View的方式,先自定义一个布局继承自LinearLayout,然后在这个布局中加入下拉 头和ListView这两个子元素,并让这两个子元素纵向排列。初始化的时候,让下拉头向上偏移出屏幕,这样我们看到的就只有ListView了。然后对 ListView的touch事件进行监听,如果当前ListView已经滚动到顶部并且手指还在向下拉的话,那就将下拉头显示出来,松手后进行刷新操 作,并将下拉头隐藏。原理示意图如下: 那我们现在就来动手实现一下,新建一个项目起名叫PullToRefreshTest,先在项目中定义一个下拉头的布局文件pull_to_refresh/apk/res/android" xmlns:tools="schemas/tools" android:id="@+id/pull_to_refresh_head" android:layout_width="fill_parent" android:layout_height="60dip" > <LinearLayout android:layout_width="200dip" android:layout_height="60dip" android:layout_centerInParent="true" android:orientation="horizontal" > <RelativeLayout android:layout_width="0dip" android:layout_height="60dip" android:layout_weight="3" > <ImageView android:id="@+id/arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@drawable/arrow" /> <ProgressBar android:id="@+id/progress_bar" android:layout_width="30dip" android:layout_height="30dip" android:layout_centerInParent="true" android:visibility="gone" /> </RelativeLayout> <LinearLayout android:layout_width="0dip" android:layout_height="60dip" android:layout_weight="12" android:orientation="vertical" > <TextView android:id="@+id/description" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_horizontalbottom" android:text="@string/pull_to_refresh" /> <TextView android:id="@+id/updated_at" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_horizontaltop" android:text="@string/updated_at" /> </LinearLayout> </LinearLayout> </RelativeLayout> 在这个布局中,我们包含了一个下拉指示箭头,一个下拉状态文字提示,和一个上次更新的时间。当然,还有一个隐藏的旋转进度条,只有正在刷新的时候我们才会将它显示出来。 布局中所有引用的字符串我们都放在stringsmit(); new HideHeaderTask()/apk/res/android" xmlns:tools="schemas/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.example.pulltorefreshtest.RefreshableView android:id="@+id/refreshable_view" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/list_view" android:layout_width="fill_parent" android:layout_height="fill_parent" > </ListView> </com.example.pulltorefreshtest.RefreshableView> </RelativeLayout> 可以看到,我们在自定义的RefreshableView中加入了一个ListView,这就意味着给这个ListView加入了下拉刷新的功能,就是这么简单! 然后我们再来看一下程序的主Activity,打开或新建MainActivity,加入如下代码: 复制代码 代码如下: public class MainActivity extends Activity { RefreshableView refreshableView; ListView listView; ArrayAdapter<String> adapter; String[] items = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); refreshableView = (RefreshableView) findViewById(R.id.refreshable_view); listView = (ListView) findViewById(R.id.list_view); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); listView.setAdapter(adapter); refreshableView.setOnRefreshListener(new PullToRefreshListener() { @Override public void onRefresh() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } refreshableView.finishRefreshing(); } }, 0); } } 可 以看到,我们通过调用RefreshableView的setOnRefreshListener方法注册了一个监听器,当ListView正在刷新时就 会回调监听器的onRefresh方法,刷新的具体逻辑就在这里处理。而且这个方法已经自动开启了线程,可以直接在onRefresh方法中进行耗时操 作,比如向服务器请求最新数据等,在这里我就简单让线程睡眠3秒钟。另外在onRefresh方法的最后,一定要调用RefreshableView中的 finishRefreshing方法,这个方法是用来通知RefreshableView刷新结束了,不然我们的ListView将一直处于正在刷新的 状态。 不知道大家有没有注意到,setOnRefreshListener这个方法其实是有两个参数的,我们刚刚也是传入了一个不起眼的 0。那这第二个参数是用来做什么的呢?由于RefreshableView比较智能,它会自动帮我们记录上次刷新完成的时间,然后下拉的时候会在下拉头中 显示距上次刷新已过了多久。这是一个非常好用的功能,让我们不用再自己手动去记录和计算时间了,但是却存在一个问题。如果当前我们的项目中有三个地方都使 用到了下拉刷新的功能,现在在一处进行了刷新,其它两处的时间也都会跟着改变!因为刷新完成的时间是记录在配置文件中的,由于在一处刷新更改了配置文件, 导致在其它两处读取到的配置文件时间已经是更改过的了。那解决方案是什么?就是每个用到下拉刷新的地方,给setOnRefreshListener方法 的第二个参数中传入不同的id就行了。这样各处的上次刷新完成时间都是单独记录的,相互之间就不会再有影响。 好了,全部的代码都在这里了,让我们来运行一下,看看效果吧。 效果看起来还是非常不错的。我们最后再来总结一下,在项目中引入ListView下拉刷新功能只需三步: 1. 在Activity的布局文件中加入自定义的RefreshableView,并让ListView包含在其中。 2. 在Activity中调用RefreshableView的setOnRefreshListener方法注册回调接口。 3. 在onRefresh方法的最后,记得调用RefreshableView的finishRefreshing方法,通知刷新结束。 从此以后,在项目的任何地方,一分钟引入下拉刷新功能妥妥的。 好了,今天的讲解到此结束,有疑问的朋友请在下面留言。 源码下载,请点击这里
Ⅳ android GridView 如何设置为左右可滚动
GridView不支持左右滚动。
左右滚动的需求可考虑:
在外层加一个HorizontalScrollView, 不过这种滑动体验并不好,上下左右均可滑动,如果是斜着滑的时候,体验差。当然,如果你会自定义HorizontalScrollView把滑动区分为斜着上下滑和斜着左右滑,再把斜着上下滑的事件传递给子View也是可以的。
可以考虑Viewpager里加载多个GridView,这样GridView就可以一页一页的滑
Ⅵ Android上这种布局和联动的滑动效果是怎么做到的
实现思路简介:viewpager是全屏的,所有页面共用的header,根据当前页面listview或者scrollview的滑动距离设置translationY;切换tab时,根据当前header的高度调整下一个tab页面的滚动距离。缺点:封面上有很多响应时,需要自己进行手势处理
Ⅶ android xml布局中如何让部分超出屏幕的滚动
你把ScrollView内的控件高度写死试试
Ⅷ Android-->RecyclerView 显示底部,滚动底部(无动画)
当你在做聊天界面的时候, 通常进入界面后, 都需要显示到最底部, 鹅场也是这么干的;
很容易就能找到 RecyclerView的smoothScrollToPosition 方法.
而且也确实实现了目的;
为什么不用 scrollToPosition 这个方法呢? 你去试试就知道!
但是,,,这个方法会带来界面的滚动, 当聊天记录特别多的时候, 这个滚动时间会持续很长, 显然产品经理不爽了, 那么看完本文, 就让他爽个够吧!
方法1:
使用 LinearLayoutManager的scrollToPositionWithOffset 这个方法可以完美的结果此问题;
这个方法会 滚动到指定的位置, 并且是置顶显示 . 第二个参数可以决定 距离顶部的offset 偏移量;
如果你传了一个不存在的position, 那么这个方法啥也不干.
并且并不会加载所有滚动经过的View, 只会加载 position 当前页能显示的View;
方法2
使用 LinearLayoutManager的逆序布局
创建 LinearLayoutManager 的时候, 第三个参数可以决定布局的顺序
通常情况下, 默认 false. 也就是从上往下开始布局.
如果设置为true, 那么LinearLayoutManager就会从底部往上开始布局,
这样的话, position == 0 的时候, 就显示在底部了;
这种情况下, 我们只需要把数据源, 从size-1 到 0逆序添加到 RecyclerView中, 就能达到和方法1中相同的效果.
那么:任意位置 滚动到底部呢????
草草的实现方式:
//上面的方法2, 也同样适用滚动到底部.
至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.