2018-2019-2 20189203 移动平台应用开发实践第八周学习总结

第31、32、33、34章

第31章 ListView

  • (一)、ListView 概念:
    ListView是Android中最重要的组件之一,几乎每个Android应用中都会使用ListView。它以垂直列表的方式列出所需的列表项。
java.lang.Object
   ? android.view.View
    ? android.view.ViewGroup
      ? android.widget.AdapterView
        ? android.widget.AbsListView
          ? android.widget.ListView
  • (二)、ListView的两个职责:
    ? 将数据填充到布局;
    ? 处理用户的选择点击等操作。
  • (三)、列表的显示需要三个元素:
    ? 1.ListVeiw:用来展示列表的View;
    ? 2.适配器: 用来把数据映射到ListView上的中介;
    ? 3.数据源: 具体的将被映射的字符串,图片,或者基本组件。
  • (四)、什么是适配器?
    适配器是一个连接数据和AdapterView的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。将数据源的数据适配到ListView中的常用适配器有:ArrayAdapter、SimpleAdapter 和 SimpleCursorAdapter。
?   ArrayAdapter最为简单,只能展示一行字;
?   SimpleAdapter有最好的扩充性,可以自定义各种各样的布局,除了文本外,还可以放ImageView(图片)、Button(按钮)、CheckBox(复选框)等等;
?   SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
?   但是实际工作中,常用自定义适配器。即继承于BaseAdapter的自定义适配器类。
  • (五)、ListView的常用UI属性:
?   android:divider
?   android:dividerHeight
?   android:entries
?   android:footerDividersEnabled
?   android:headerDividersEnabled

第32章GridView

Android 的 GridView 以二维滚动网格(行和列)显示项目,网格项目不一定是预定的,但它们会自动使用 ListAdapter 布局插入。
一个适配器实际上是UI组件和数据源之间的桥梁,填充数据到UI组件。适配器可以用来提供数据,如:微调,列表视图,网格视图等。
ListView 和 GridView 是 AdapterView 的子类,它们可以绑定填充到一个适配器,从外部源检索数据,并创建一个视图表示每个数据项。
原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/android/android_grid_view.html

这个例子将通过简单的步骤显示如何使用 GridView 创建自己的 Android 应用程序。按照下面的步骤来 创建Android 应用程序 GridView:
Step 描述
1 使用Eclipse IDE创建Android应用程序,并将其命名为GridView在包com.yiibai.gridview下。
2 修改res/layout/activity_main.xml文件的默认内容以包括GridView的内容以及它的属性。
3 在res/values/strings.xml文件中定义所需的常量。
4 把几张照片放在res/drawable-hdpi文件夹。这几张相处如下:sample0.jpg, sample1.jpg, sample2.jpg, sample3.jpg, sample4.jpg, sample5.jpg, sample6.jpg 和 sample7.jpg.
5 在包com.yiibai.helloworld下创建一个新类ImageAdapter扩展BaseAdapter。将用于填充视图,这个类将实现一个适配器的功能。
6 运行该应用程序启动Android模拟器并验证应用程序所运行的结果。
以下是内容是主活动文件 src/com.yiibai.gridview/MainActivity.java。这个文件可以包括每个的基本生命周期方法。

package com.yiibai.gridview;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.GridView;

public class MainActivity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      GridView gridview = (GridView) findViewById(R.id.gridview);
      gridview.setAdapter(new ImageAdapter(this));
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }
   
}

下面是 res/layout/activity_main.xml 文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
   android:id="@+id/gridview"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent"
   android:columnWidth="90dp"
   android:numColumns="auto_fit"
   android:verticalSpacing="10dp"
   android:horizontalSpacing="10dp"
   android:stretchMode="columnWidth"
   android:gravity="center"
/>

以下是文件 res/values/strings.xml 内容定义两个常量:

<?xml version="1.0" encoding="utf-8"?>
<resources>

   <string name="app_name">HelloWorld</string>
   <string name="action_settings">Settings</string>

</resources>

以下是 src/com.yiibai.gridview/ImageAdapter.java 文件的内容:

package com.yiibai.gridview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
   private Context mContext;

   // Constructor
   public ImageAdapter(Context c) {
      mContext = c;
   }

   public int getCount() {
      return mThumbIds.length;
   }

   public Object getItem(int position) {
      return null;
   }

   public long getItemId(int position) {
      return 0;
   }

   // create a new ImageView for each item referenced by the Adapter
   public View getView(int position, View convertView, ViewGroup parent) {
      ImageView imageView;
      if (convertView == null) {
      imageView = new ImageView(mContext);
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
      imageView.setPadding(8, 8, 8, 8);
      } else {
      imageView = (ImageView) convertView;
      }

      imageView.setImageResource(mThumbIds[position]);
      return imageView;
   }

   // Keep all Images in array
   public Integer[] mThumbIds = {
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7,
      R.drawable.sample_0, R.drawable.sample_1,
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7,
      R.drawable.sample_0, R.drawable.sample_1,
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7
   };
}

让我们尝试运行 GridView 应用程序,Eclipse AVD上安装的应用程序,并启动它,如果设置和应用都没有问题,它会显示以下模拟器窗口:
原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/android/android_grid_view.html
这个例子将通过简单的步骤显示如何使用 GridView 创建自己的 Android 应用程序。按照下面的步骤来 创建Android 应用程序 GridView:
Step 描述
1 使用Eclipse IDE创建Android应用程序,并将其命名为GridView在包com.yiibai.gridview下。
2 修改res/layout/activity_main.xml文件的默认内容以包括GridView的内容以及它的属性。
3 在res/values/strings.xml文件中定义所需的常量。
4 把几张照片放在res/drawable-hdpi文件夹。这几张相处如下:sample0.jpg, sample1.jpg, sample2.jpg, sample3.jpg, sample4.jpg, sample5.jpg, sample6.jpg 和 sample7.jpg.
5 在包com.yiibai.helloworld下创建一个新类ImageAdapter扩展BaseAdapter。将用于填充视图,这个类将实现一个适配器的功能。
6 运行该应用程序启动Android模拟器并验证应用程序所运行的结果。
以下是内容是主活动文件 src/com.yiibai.gridview/MainActivity.java。这个文件可以包括每个的基本生命周期方法。

package com.yiibai.gridview;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.GridView;

public class MainActivity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      GridView gridview = (GridView) findViewById(R.id.gridview);
      gridview.setAdapter(new ImageAdapter(this));
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }
   
}

下面是 res/layout/activity_main.xml 文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
   android:id="@+id/gridview"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent"
   android:columnWidth="90dp"
   android:numColumns="auto_fit"
   android:verticalSpacing="10dp"
   android:horizontalSpacing="10dp"
   android:stretchMode="columnWidth"
   android:gravity="center"
/>

以下是文件 res/values/strings.xml 内容定义两个常量:

<?xml version="1.0" encoding="utf-8"?>
<resources>

   <string name="app_name">HelloWorld</string>
   <string name="action_settings">Settings</string>

</resources>

以下是 src/com.yiibai.gridview/ImageAdapter.java 文件的内容:

package com.yiibai.gridview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
   private Context mContext;

   // Constructor
   public ImageAdapter(Context c) {
      mContext = c;
   }

   public int getCount() {
      return mThumbIds.length;
   }

   public Object getItem(int position) {
      return null;
   }

   public long getItemId(int position) {
      return 0;
   }

   // create a new ImageView for each item referenced by the Adapter
   public View getView(int position, View convertView, ViewGroup parent) {
      ImageView imageView;
      if (convertView == null) {
      imageView = new ImageView(mContext);
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
      imageView.setPadding(8, 8, 8, 8);
      } else {
      imageView = (ImageView) convertView;
      }

      imageView.setImageResource(mThumbIds[position]);
      return imageView;
   }

   // Keep all Images in array
   public Integer[] mThumbIds = {
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7,
      R.drawable.sample_0, R.drawable.sample_1,
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7,
      R.drawable.sample_0, R.drawable.sample_1,
      R.drawable.sample_2, R.drawable.sample_3,
      R.drawable.sample_4, R.drawable.sample_5,
      R.drawable.sample_6, R.drawable.sample_7
   };
}

让我们尝试运行 GridView 应用程序,Eclipse AVD上安装的应用程序,并启动它,如果设置和应用都没有问题,它会显示以下模拟器窗口:

第33章样式和主题

在android很多地方要对控件的样式(如:ActionBar的样式)和Activity的样式进行设置,对应控件的样式设置是(Style)对Activity的样式设置是(Theme)
API是这样来解释Style的:
  A style resource defines the format and look for a UI.A style can be applied to an individual View (from within a layout file)
   or to an entire Activity or application (from within the manifest file)
下面就来说说怎么进行style设置:
1.在资源文件夹里创建好style.xml和theme.xml
2.在XML文件中都要添加一个根节点
3.在根节点里面

1 <!-- TextView设定的简单样式 -->
2     <style name="TextStyle">    
3         <item name="android:textColor">#008</item>
4         <item name="android:textSize">18sp</item>
5     </style>

在MainActivity当中添加一个TextView

1  <TextView
2         style="@style/TextStyle"   
3         android:layout_width="wrap_content"
4         android:layout_height="wrap_content"
5         android:text="我是没有改变style的TextView" />

在没有写style="@style/TextStyle"的时候运行出来TextView的字体就是普通效果。
则对View的样式添加成功了的
Theme:
现在Values.中添加一个Theme.xml文件,在Theme.xml的根节点里面写上

第34章 位图处理

  • 图片的压缩
      为了省流量,以及防止OOM,必须在图片上传的时候对图片进行压缩。减小图片大小,对于手机端来说无非是三种:一是裁剪大小,二是降低质量,三是图片的颜色编码。我们的策略也是:先裁剪大小,然后进行质量压缩,采用低编码。我们的目标是图片压缩到200kb以内。
      静态图片基本策略:微信以1280720的尺寸为基准裁剪的。这个基准应该是几年前的时候,那个时候主流或偏上的手机屏幕的尺寸。目前基本都在19201080的或更高,所以我们采用19201080的基准,完全能达到要求了。分别用图片对应的高除以1920,图片的宽除以1080,得到scale,比较两个scale,哪个大用那个,然后对图片进行缩放处理。长图片另外处理(判断长图的依据:高宽比例或宽高比例大于等于4则认为是长图,长图不做裁剪只做质量压缩)。
      GIF图片压缩基本策略:抽帧后再拼凑的方式压缩。比如2帧取1帧,然后判断达到要求否,如果么有,就继续3帧抽1帧,一直做下去达到要求的大小为止(目前没有想到更好的办法压缩)...抽帧后拼凑的时候需要注意每帧的时间需要delay(原帧之间的时间)
    抽帧的数量级(比如2帧取1帧,那么就是2)。缺点:可能导致效果不太理想,抽掉的帧太多导致动图动的不流畅。基本能满足大部分的GIF图片。
      图片的颜色编码:Bitmap.Config.RGB_565。
    判断长图:
   /**
    * 图片的宽高或高宽比例>=4则定为长图
    */
   public static boolean isLongImg(int imgWidth, int imgHeight) {
       if (imgWidth > 0 && imgHeight > 0) {
           int num = imgHeight > imgWidth ? imgHeight / imgWidth : imgWidth / imgHeight;
           if(DEBUG){
               Log.i("PhotoView", "宽高或高宽比例>=4认为是长图: " + num);
           }
           if (num >= LONG_IMG_MINIMUM_RATIO) {
               return true;
           }
       }
       return false;
   }

2018-2019-2 20189203 移动平台应用开发实践第八周学习总结

上一篇:iOS CATransition 自定义转场动画


下一篇:Android学习(三)