Android UI系列-----ScrollView和HorizontalScrollView的详解

本篇随笔将讲解一下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来了解更多有关这两个控件的知识。

原文链接:http://www.cnblogs.com/xiaoluo501395377/p/3460645.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android自定义HorizontalScrollView实现qq侧滑菜单

    今天看了鸿洋_大神在慕课网讲的qq5.0侧滑菜单.学了不少的知识,同时也佩服鸿洋_大神思路的清晰. 看了教程课下也自己实现了一下.代码几乎完全相同  别喷我啊..没办法 o(︶︿︶)o 唉 像素不好 没办法 找不到好的制作gif的软件. 我们暂且称侧滑左边界面的为menu,右边为content 首先是menu的布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:androi

  • HorizontalScrollView水平滚动控件使用方法详解

    一.简介 用法ScrollView大致相同 二.方法 1)HorizontalScrollView水平滚动控件使用方法 1.在layout布局文件的最外层建立一个HorizontalScrollView控件 2.在HorizontalScrollView控件中加入一个LinearLayout控件,并且把它的orientation设置为horizontal 3.在LinearLayout控件中放入多个装有图片的ImageView控件 2)HorizontalScrollView和ScrollVie

  • Android中实现多行、水平滚动的分页的Gridview实例源码

    功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现. (2)水平滚动翻页,下面有显示当前页的icon. 1.实现自定义的HorizontalScrollView(HorizontalScrollView.java): 因为要翻页时需要传当前页给调用者,所以fling函数中自己

  • android listview 水平滚动和垂直滚动的小例子

    网上有很多解决 android listview 水平和垂直滚动的代码,我没有按照他们说的做(以前没搜到 O(∩_∩)O~) 我采用的是添加HorizontalScrollViewJava代码 复制代码 代码如下: < ScrollView android:id="@+id/ScrollView01" android:layout_height="300px" android:layout_x="16px" android:layout_y

  • Android自定义HorizontalScrollView打造超强Gallery效果

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会OOM(ViewPager内

  • Android HorizontalScrollView内子控件横向拖拽实例代码

    前言 网上ListView上下拖动的例子有,效果也很好,但是项目要横着拖的,只要硬着头皮自己写(主要是没找到合适的),参考文章1修改而来,分享一下. 正文 截图 实现代码: public class HoDragActivity extends Activity { private LinearLayout main; private GestureDetector mGestureDetector; @Override public void onCreate(Bundle savedInst

  • Android利用HorizontalScrollView仿ViewPager设计简单相册

    最近学习了一个视频公开课,讲到了利用HorizontalScrollView仿ViewPager设计的一个简单相册,其实主要用了ViewPager缓存的思想.此篇文章参考:Android自定义HorizontalScrollView打造超强Gallery效果(这篇文章与公开课的讲的大致一样) 这里简单说一下ViewPager的缓存机制 1.进入ViewPager时,加载当前页和后一页: 2.当滑动ViewPager至下一页时,加载后一页,此时第一页是不会销毁的,同时加载当前页的下一页. 其实就是

  • Android HorizontalScrollView左右滑动效果

    本文实例为大家分享了Android HorizontalScrollView左右滑动的具体代码,供大家参考,具体内容如下 效果图 一.什么是HorizontalScrollView HorizontalScrollView实际上是一个FrameLayout ,这意味着你只能在它下面放置一个子控件 ,这个子控件可以包含很多数据内容.有可能这个子控件本身就是一个布局控件,可以包含非常多的其他用来展示数据的控件.这个布局控件一般使用的是一个水平布局的LinearLayout.TextView也是一个可

  • Android中HorizontalScrollView使用方法详解

    由于移动设备物理显示空间一般有限,不可能一次性的把所有要显示的内容都显示在屏幕上.所以各大平台一般会提供一些可滚动的视图来向用户展示数据.Android平台框架中为我们提供了诸如ListView.GirdView.ScrollView等滚动视图控件,这几个视图控件也是我们平常使用最多的.下面介绍一下HorizontalScrollView的使用和需要注意的点:  HorizontalScrollView是一个FrameLayout  ,这意味着你只能在它下面放置一个子控件,这个子控件可以包含很多

  • Android使用自定义控件HorizontalScrollView打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现:多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最简单的一种实现~~~ 1.原理分析 既然是侧滑,无非就是在巴掌大的屏幕,塞入大概两巴掌大的布局,需要滑动可以出现另一个,既然这样,大家为啥不考虑使用Android

随机推荐