第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;
}