ScrollView

Android ScrollView嵌套ScrollView,并且嵌套的ScrollView超过屏幕部分 问题:我在ScrollView里面嵌套了一个ScrollView,嵌套的ScrollView超出了屏幕显示部分,需要向下滑动才能看到,当滑动下去找到嵌套的ScrollView时,滑动时并不能触发它的onTouch()事件。Android的Touch传递机制,这里不详细介绍了,有想了解的,推荐http://blog.youkuaiyun.com/chunqiuwei/article/details/4108492 阅读详情

本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是一个水平方向的可以滚动的View。本篇随笔可能描述性的知识比较少,最主要还是通过代码来看看如何使用这两个View。

一、ScrollView的简单介绍

首先来看看ScrollView和HorizontalScrollView这两个View的定义。ScrollView和HorizontalScrollView都是一个布局容器,里面可以放入child View控件,我们通过其继承关系看到,ScrollView和HorizontalScrollView这两个类是ViewGroup的一个间接子类。

java.lang.Object
   ↳    android.view.View
        ↳    android.view.ViewGroup
             ↳    android.widget.FrameLayout
                  ↳    android.widget.ScrollView
java.lang.Object
   ↳    android.view.View
        ↳    android.view.ViewGroup
             ↳    android.widget.FrameLayout
                  ↳    android.widget.HorizontalScrollView

因为ScrollView和HorizontalScrollView只是两种滚动方向不同的View而已,其他方面都基本相同,所以下面只单单以ScrollView来讲解。

通过使用ScrollView,我们可以滚动其里面的子View控件,这样就允许我们控件的高度可以大于我们实际屏幕的尺寸高度。ScrollView是一个FrameLayout,至于什么是FrameLayout,简单的来说,FrameLayout通常被用来设计成在屏幕上占用一块地方并且里面只有一个Item,我们常用到的例如DatePicker、TimePicker这些控件都是属于FrameLayout布局的。因此在ScrollView当中,也通常只包含一个子元素,并且这个子元素也是一个布局文件,这样我们才能在这个布局文件里面添加我们想要的任何子控件,从而实现滚动的效果。

对于ScrollView来说,因为其是垂直方向上的滚动布局,因此通常我们给其添加一个LinearLayout的子元素,并且设置orientation为vertical(垂直方向的)。下面我们通过一个小例子来看看如何使用我们的ScrollView来展示多张图片,并且实现图片的垂直方向的滚动。

首先我们定义一个ScrollView,因为ScrollView也是一个ViewGroup,所以我们可以直接使用ScrollView作为我们的xml文件的根元素:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="false">

    <LinearLayout
        android:id="@+id/layout"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:orientation="vertical"/>

</ScrollView>
复制代码

我们看到,在ScrollView元素下面我们还给其定义了一个LinearLayout,并且设置了其方向为垂直方向的线性布局。我们添加图片的操作放在了代码中来完成。下面来看一下ScrollViewActivity这个类:

复制代码
public class ScrollViewActivity extends Activity
{
    private LinearLayout layout;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_scrollview);

        layout = (LinearLayout) findViewById(R.id.layout);

        for(int i = 0; i < 8; i++)
        {
            //  通过资源文件来获得指定一个Drawable对象
            Drawable drawable = getResources().getDrawable(R.drawable.kk_hero);
            ImageView imageView = new ImageView(this);
            imageView.setImageDrawable(drawable);
            layout.addView(imageView);
        }
    }
}
复制代码

我们看到,这个Activity非常的简单,因为LinearLayout就是一个ViewGroup对象,所以我们可以动态的给其添加我们想要的View控件,这里我们给其添加了8张图片,我们来看看效果:

我们看到,在Activity启动以后,就会在其下面生成8个ImageView的对象,并且这几张图片是可以在垂直方向上滚动的。

二、通过ScrollView实现从服务器端获取一条新闻,显示在界面上

接下来咱们通过ScrollView来做一个稍微实际一点的例子,我们经常会用手机来看新闻,当然一篇新闻是从服务器端获取过来的数据,而且可能一篇新闻里面有很多的内容,因此我们需要使用一个可以滚动的布局来显示我们的新闻内容,而TextView本身是可以实现文本的滚动显示的,但是结合ScrollView和TextView可以有更好的效果。

我们服务器端就很简单,让我们的应用程序访问服务器端的一个Html的文件,我们知道Html的文件里面会有许多的Html标签,那么我们如果想在Android上也能够显示标签的样式,就不能单单的只是将获取到的文本内容展示出来而已,这里就需要用的Android提供的一个 Html 的类,用它来处理我们从服务器端获得的Html的字符串内容:

我们的布局文件还是使用的刚才那一个:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="false">

    <LinearLayout
        android:id="@+id/layout"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:orientation="vertical"/>

</ScrollView>
复制代码

因为要访问网络,所以这里需要新建一个HttpUtils的工具类,来获得服务器端的文本内容:

复制代码
public class HttpUtils
{
    /**
     * 访问服务器端的内容
     * @param path  访问的url地址
     * @param encode    编码方式
     * @return  返回String类型的值
     */
    public static String getDataFromServer(String path, String encode)
    {
        String result = "";

        HttpClient httpClient = new DefaultHttpClient();
        try
        {
            HttpPost httpPost = new HttpPost(path);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            if (httpResponse != null && httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
            {
                result = EntityUtils.toString(httpResponse.getEntity(), "utf-8");
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            httpClient.getConnectionManager().shutdown();
        }

        return result;
    }
}
复制代码

我们还是用之前那个Activity:

复制代码
public class ScrollViewActivity extends Activity
{
    private LinearLayout layout;
    private ProgressDialog dialog;
    private TextView textView;
    private final String PATH = "http://172.25.152.34:8080/httptest/news.html";
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_scrollview);

        dialog = new ProgressDialog(this);
        dialog.setTitle("提示信息");
        dialog.setMessage("loading......");
        dialog.setCancelable(false);
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

        layout = (LinearLayout) findViewById(R.id.layout);
        textView = new TextView(this);

        layout.addView(textView);

        new MyTask().execute(PATH);
    }

    public class MyTask extends AsyncTask<String, Void, String>
    {
        @Override
        protected void onPreExecute()
        {
            dialog.show();
        }

        @Override
        protected String doInBackground(String... params)
        {
            String result = HttpUtils.getDataFromServer(params[0], "utf-8");
            return result;
        }

        @Override
        protected void onPostExecute(String s)
        {
            //  Html类的fromHtml方法可以处理一个Html的字符串文本,这样就可以根据Html的标签在手机上展示其样式
            Spanned spanned = Html.fromHtml(s);
            textView.setText(spanned);
            //  给TextView设置一个方法,传一个LinkMovementMethod对象进去,这样当文本中如果有href链接时,系统会自动打开浏览器跳转到该href上
            textView.setMovementMethod(new LinkMovementMethod());
            dialog.dismiss();
        }
    }
}
复制代码

因为要访问网络数据,所以我们需要开启一个AsyncTask的一部任务,我们来看看onPostExecute方法,在获取到服务器端的Html文本内容后,我们通过Android提供的Html.fromHtml方法可以处理我们的Html文本,将Html的标签转化为我们需要的样式显示,但是这里要注意一点,这里并不会处理所有的Html的表情,例如<img>我们来看看Android官方API对这个方法的描述:

public static Spanned fromHtml (String source)

Returns displayable styled text from the provided HTML string. Any <img> tags in the HTML will display as a generic replacement image which your program can then go through and replace with real images.

This uses TagSoup to handle real HTML, including all of the brokenness found in the wild.

如果文本当中有<img>标签,那么这个方法就会用一个默认的图片来代替我们的<img>标签中的图片,我们可以自己写一个Html.ImageGetter来加载我们自己想要的图片。

同时,因为文本内容中可能有href链接,因此我们可以通过 textView.setMovementMethod(new LinkMovementMethod()); 来绑定一个LinkMovementMethod,这样在点击链接的时候,就会调用浏览器跳转到该链接上。

相信通过前面的讲解,大家对ScrollView有了进一步的认识,这里并没有讲太多的HorizontalScrollView的知识,因为这个其实是和ScrollView基本上是一样的,只不过一个是垂直方向的滚动,而HorizontalScrollView是水平方向的滚动,同样HorizontalScrollView也是一个FrameLayout,因此我们通常给其定义一个水平方向布局的LinearLayout子元素,这样我们在里面添加的View子控件就可以在水平方向上滚动显示了。

 

三、总结

本篇随笔主要讲解了一下ScrollView和HorizontalScrollView的知识,因为这两个布局容器比较简单,因此基本上概念性的东西讲的少,主要还是通过代码来了解了ScrollView的使用方式,而对于HorizontalScrollView,其使用方式大同小异,大家可以通过Android官方API来了解更多有关这两个控件的知识
Scrollview的 一些简单介绍 与ScrollView相比,NestedScrollView的主要区别是增加了对嵌套滚动的支持。insideOverlay Overlay(覆盖的意思)在Scrollview内容的最右边, 不会改变改变padding的大小,浮在Scrollview内容view的上面,会遮挡内容view -这是Scrollview的默认的。insideInset 将滚动条插入到Scrollview内容的view的后面,会增大Scrollview的padding值的大小,但是会压缩Scrollview内容view的大小。 阅读详情

相关推荐

Android 中 ScrollView 的基本使用

Android 中 ScrollView 的基本使用1. 垂直滚动: ScrollView2. 水平滚动: HorizontalScrollView 子布局只能有一个. 1. 垂直滚动: ScrollView <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.

YKenan的博客 4108

【Android从零单排系列二十七】《Android视图控件——HorizontalScrollView》

小伙伴们,在上文中我们介绍了Android视图组件ScrollView,本文我们继续盘点,介绍一下视图控件的HorizontalScrollView。HorizontalScrollView是Android SDK中的一个视图容器,它允许用户在水平方向上滚动其子视图。它可以用来展示横向的大量内容,当内容超过屏幕宽度时,用户可以通过水平滑动来查看隐藏的部分。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 2337

IOS ScrollView 内嵌 ScrollView 冲突处理

项目中有一个需求,主体页面利用ScrollView实现类似网页新闻客户端那样的分栏效果,同时在部分页面中还存在筛选的页面,两个滑动方向都是水平方向,势必存在的滑动冲突问题。 经过调查找到了解决方法: 在子ScrollView上添加滑动手势: UISwipeGestureRecognizer* swipeGesture = [[UISwipeGestureRecognizer al

跬步 2316

【Android控件】HorizontalScrollView的基础使用记录(滚动条自定义)

HorizontalScrollView用于布局的容器,可以放置让用户使用滚动条查看的视图层次结构,允许视图结构比手机的屏幕大。HorizontalScrollView是一种 FrameLayout(框架布局),其子项被滚动查看时是整体移动的,并且子项本身可以是一个有复杂层次结构的布局管理器。一个常见的应用是子项在水平 方向中,用户可以滚动显示顶层水平排列的子项(items)。很适合用场景、图片无限滑动,底部多个自定义按钮布局(支持递增)等。...

PYB 4055

Android 监听ScrollView的滑动

今天,简单讲讲Android 如何监听ScrollView的滑动。  有时候我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部。可惜的是SDK并没有相应的方法,不过倒是提供了一个  protected void onScrollChanged(int x, int y, int oldx, int oldy) 方法,显然这个方法是不能被外界调用的,...

谢岩的博客 2438

VC对ScrollView的调整

automaticallyAdjustsScrollViewInsets automaticallyAdjustsScrollViewInsets是ViewController的一个属性,指示VIewController是否需要自动调整ScrollViewInsets。 默认值为YES,允许ViewController自动调整ScrollViewInsets VC对ScrollView的调整 当au

苏苏苏紫Sue的博客 1079

横向滑动视图HorizontalScrollView精炼详解

一、前期基础知识储备 由于移动设备物理显示空间一般有限,不可能一次性的把所有要显示的内容都显示在屏幕上。所以各大平台一般会提供一些可滚动的视图来向用户展示数据。Android平台框架中为我们提供了诸如ListView、GirdView、ScrollView、RecyclerView等滚动视图控件,这几个视图控件也是我们平常使用最多的。本节内容我们来分析一下横向滚动视图Horizonta...

Chin_Style的博客 3万+

qml QtQuick2 ScrollView代码控制ScrollView滚动、ScrollView自动滚动

此文章讲了QtQuick2的ScrollView如何代码控制其滚动

qq_41634188的博客 1754

ScrollView中嵌套ScrollView的滑动问题

ScrollView中嵌套ScrollView时,滑动时,默认情况下,手指在哪个ScrollView上滑动,滑动事件就被其消费掉,滑动距离就在其上。 有时,会期望滑动内部ScrollView时,由外层的控制器来控制滑动的距离应该由哪个ScrollView来体现。看到一种实现方式,在此记录下: 总体思路是: 移除当前被嵌套的ScrollView自身的contentOffset的观察者 对被嵌套的ScrollView的contentOffset属性设置观察者,设置为当前控制器 contentOffset发生变

hankesi的专栏 1645

Android水平滑动视图(HorizontalScrollView)的实现及代码解析

在上述代码中,我们创建了一个LinearLayout对象作为HorizontalScrollView的子视图容器,并设置其方向为水平方向。最后,将ImageView对象添加到LinearLayout中,并将LinearLayout设置为HorizontalScrollView的子视图。本文将介绍如何使用HorizontalScrollView来实现左右滑动效果,并附上相应的源代码。通过将多个子视图添加到HorizontalScrollView的LinearLayout容器中,可以轻松实现横向滑动的功能。

2301_79326930的博客 748

Cocos2dx-lua ScrollView[一]基础篇

cocos游戏中ScrollView控件大量使用,95%以上的项目都会使用ScrollView,个别游戏可能全部使用翻页的滑动效果。如果想要精通Cocos的UI开发,精通ScrollView控件非常关键,因此对ScrollView的使用进行总结很有必要

ellis1970的博客 1716

React Native之ScrollView判断滚动方向

2019-02-22   1、在一个onScrollBeginDrag回调方法(ScrollView开始拖动开始时触发)中记录event.nativeEvent.contentOffset.y:Y轴滚动的偏移量。   2、在onScroll滚动事件回调方法中判断当前contentOffset.y与记录的Y轴滚动的偏移量: (1)若记录的Y轴滚动的偏移量 &lt; 当前contentOff...

举世武双的博客 5769

F28335 DSP ePWM模块实战:从基础配置到电机控制

本文详细解析了TI TMS320F28335 DSP的ePWM模块,从基础概念、寄存器配置到实战应用。通过代码示例,手把手教你如何配置定时中断、生成PWM波形、实现死区保护与故障联防,并最终完成一个可调速、可换向的直流电机控制项目,是掌握F28335电机控制核心技术的实战指南。

g5h6i的博客 1127

android ScrollView 中嵌套Scrollview 怎么办?

主要涉及到子Scrollview监测父Scrollview的点击事件,做相应的响应。 [java] view plain copy  print? public class ChildScrollview extends ScrollView {           private ScrollView F_scrollview;

世界的这一个角落 550

算力网:正在编织的“第二电网“

中国算力网:编织智能时代的"第二电网" 中国正在构建全国一体化算力网,目标让算力资源像水电一样即取即用。这一国家战略通过"东数西算"布局,将东部算力需求与西部清洁能源优势结合,形成三级时延圈(1ms城市级、5ms区域级、20ms国家级)。算力网采用三层架构:基础设施层的八大枢纽节点作为"发电厂",编排管理层的智能调度系统作为"调度中心",运营服务层提供标准化算力服务。关键技术包括算力路由、异构算力统一度量、无损网络和液冷技术等。

这只是一个博客 666

手把手解决GD32H759I-EVAL以太网通信三大坑:IP冲突、端口绑定失败、LWIP内存泄漏

本文针对GD32H759I-EVAL开发板在以太网通信调试中常见的三大难题——IP地址冲突、端口绑定失败和LWIP内存泄漏,提供了详细的实战排障指南。文章深入分析了问题根源,并给出了具体的网络配置、端口管理策略和内存泄漏检测方法,帮助开发者快速定位并解决嵌入式网络通信中的棘手问题,确保系统稳定运行。

weixin_29196315的博客 139

ScrollView嵌套ListView问题:如何让ListView随着ScrollView一起滚动

如题,Android滚动控件有个规律:一个父滚动控件嵌套了一个子滚动控件,当手指在两个控件重叠部分滑动时,会优先触发子控件的滚动属性。那么如何只触发父控件的滚动属性而不触发子控件的滚动属性?很简单,只要让整个ListView在父布局中显示出来就好了。假设父布局是一个不会滚动的控件(如RelativeLayout),当ListView在父布局中完全显示时(限制是这个ListView高度小于屏幕高度)

CZH 3024

Tartancalib标定OAK-FFC_4p(上)

1.使用Tartancalib标定双目或多目相机前,先对单个相机标定获得内参,再获得外参。

qq_51731421的博客 1277

Android ScrollView去掉滚动条及ScrollView属性

上来直接发想要的: android:scrollbars="none" 这个就是消除滚动条的属性 下面是详细介绍ScrollView 的属性(适用于Horizontal) 属性名称 描述 android:background 设置背景颜色/背景图片。可以通过以下两种方法设置背景为透明:”@android:color/transparent”和”@nul

迷途可达C的博客 6876

IAP板卡远程升级(串口网口都可)+Ymodem+AES对bin文件加密+pc软件+板卡相互烧录

还是决定记录一下,毕竟这个东西我也搞了挺久的,遇到一些棘手的,或者是因为我很粗心遇到的问题也和大家分享一下,。 板卡核心是 STM32F103RCT6,256kflash 前言 开始看这个远程升级的时候,我是一头雾水的,原子哥的教程里面也有说到过iap,有了一个大概的了解,我想不明白的是,通过串口下载的方式把hex文件下载到flash,和把bin文件下载到flash难道不是拉一根线,下载一个文件嘛,(初入职场的我并没有考虑到安全这个问题)如果直接将hex文件给到客户那边,风险是非常大...

那可真是太开心了的博客 5371

国科大学习资料--计算机网络--历年考题1

国科大学习资料–计算机网络–历年考题1 1、假定有一个通信协议,每个分组都引入100字节的开销用于头和成帧,现在使用这个协议发送1M字节的数据(为方便计算,1M=10^6),然而在传递的过程中有一个字节被破坏了,因而包含该字节的那个分组被丢弃并重传。(1)当数据的分组大小为1000、5000、20000和40000字节时,计算相应(包括开销)的传递字节总数目。(2)计算分组大小的最优值是多少,即分组的大小为何值时总的传输字节数最少。(提示:最优值不是1000、5000、20000和40000字节中的一个)

无名何许人的博客 1180

ScrollView嵌套ScrollView的滑动冲突

ScrollView嵌套ScrollView的滑动冲突 全部转自(https://www.jianshu.com/p/eedc98eecf02)感谢分享留作为自己学习 结论: 在自定义控件中如下重写onInterceptTouchEvent就告诉所有父View:不要拦截事件,让我消费!! @Override public boolean onInterceptTouchEv...

万子的博客 949

C# 上位机之海康工业相机开发(SDK)实战教程

海康工业相机的C#开发核心是基于MVS SDK的“初始化→枚举→连接→采集→释放”流程,其中图像回调处理和格式转换是关键。严格按照SDK文档处理设备类型(网口/USB)和像素格式;及时释放图像资源,避免内存泄漏;错误码是排查问题的重要依据(可参考SDK中的“错误码说明”文档)。掌握这些基础后,可结合机器视觉算法(如OpenCV)实现缺陷检测、尺寸测量等高级功能,构建完整的工业视觉系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 3829

react-native中ScrollView套ScrollView

react-native中ScrollView套ScrollView(安卓环境);ScrollView嵌套;父ScrollView套子ScrollView;父ScrollView不滑动,子ScrollView滑动

诚实可靠小郎君的博客 3213

串口、COM、UART、TTL、USB、RS-232、RS-485、I2C、SPI、CAN、1-WIRE

一文搞定,赶紧收藏吧

记得诚 3万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: android JSON
下一篇: Canvas画图
freemindhack
博客等级 码龄13年 53粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值