Android 关于GridView控件的处理
本人一直以为做一般的Android应用开发,其中创意也就是有好的Idea是至关重要的,其次是要有解决一般问题的想法,如如何实现一个应用兼容多种屏幕分辨率的问题(即使android对于图片的处理,默认情况先是自适应的,即等比例或缩放图片),如何自己实现网络图片的分段下载,如何实现不同Activity之间的数据传递问题,当Listview中数据量过大时,如何实现数据的分批下载等问题。结果上周去参加了一个面试,呜呜---,让当场编写一个GridView实现手机SDcard内置图片的Thumb nail以及图片的修剪也翻转问题。以前都是现用现查文档或者帮助的,以至于当时傻眼了,控件都不知道怎么用,哎,离开了网络感觉什么都干不了啊,今天下午有些闲暇就整理了一个应用,实现其功能。先看下源代码实现了对图片的Thumbnails功能:
package com.daisy.android.components;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;
public class GridViewActivity extends Activity {
public static String TAG = "Grid_view";
private GridView gridView;
private ArrayList<HashMap<String, String>> list;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findView();
}
private void findView() {
gridView = (GridView) findViewById(R.id.gridview);
list = new ArrayList();
filepath("/sdcard");
// test the contents in the list
for (int i = 0; i < list.size(); i++) {
Log.i(TAG, list.get(i).get("path") + "-----");
}
String[] from = { "path" };
int[] to = { R.id.imageView };
ListAdapter adapter = new GridAdapter(this, list, R.layout.item, from,
to);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(listener);
}
OnItemClickListener listener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
String imagePath = list.get(position).get("path");
Intent intent = new Intent(GridViewActivity.this, ImageViewer.class);
intent.putExtra("path", imagePath);
startActivity(intent);
}
};
public void filepath(String str) {
Log.i(TAG, str + "---path---");
File file = new File(str);
if (file.isDirectory()) {
String[] filePath = file.list();
for (String path : filePath) {
file = new File(str + "/" + path);
if (file.isDirectory() && !path.equals("DCIM")) {
filepath(str + "/" + path);
} else if (path.endsWith(".jpg")) {
HashMap hash = new HashMap();
hash.put("path", str + "/" + path);
list.add(hash);
}
}
}
}
class GridAdapter extends SimpleAdapter {
public GridAdapter(Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
// TODO Auto-generated constructor stub
}
// set the imageView using the path of image
public void setViewImage(ImageView v, String value) {
try {
Bitmap bitmap = BitmapFactory.decodeFile(value);
Bitmap newBit = Bitmap
.createScaledBitmap(bitmap, 100, 80, true);
v.setImageBitmap(newBit);
} catch (NumberFormatException nfe) {
v.setImageURI(Uri.parse(value));
}
}
}
}
首先,对于手机内部,当余户第一次浏览图片时,会在其/sdcard/DCIM目录生成图片对应的Thumbnails。可能在File Explorer中看不到,但是通过代码可以看到其thumbnail文件(可参考附件)。当然如果你想直接使用thumbnail的图片,这样你就要解决一个Thumbnails图片与原始图片的一个映射关系。关于其映射关系,这个以后会谈到。说先在这里,我做的是对原始图片直接的一个Scale
【Android图片的处理大部分是通过Bitmap的图像处理方法实现的】。
下面代码实现了原始图片的剪切和反转:
package com.daisy.android.components;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.Toast;
/**
*@author Andrew.Lee
*@create 2011-6-8 下午03:11:13
*@version 1.0
*@see
*/
public class ImageViewer extends Activity {
private static String TAG = "ImageView";
private ImageView imageView;
private Intent intent;
private Drawable drawable;
private String imagePath;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.image);
findViews();
}
public void findViews() {
imageView = (ImageView) findViewById(R.id.image);
intent = this.getIntent();
imagePath = intent.getStringExtra("path");
Log.i(TAG, "image path:" + imagePath + "======");
drawable = Drawable.createFromPath(imagePath);
imageView.setImageDrawable(drawable);
}
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
menu.add("process");
return result;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if (item.getTitle().equals("process")) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix m = new Matrix();
m.setRotate(45);
bitmap = Bitmap.createBitmap(bitmap, (width - 100) / 2,
(height - 100) / 2, 100, 100, m, true);
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setImageBitmap(bitmap);
}
return super.onOptionsItemSelected(item);
}
}
从上面代码可以看到,对于图片的处理,都是通过生成Bitmap对象再进行操作的。
- 大小: 147.3 KB
- 大小: 76 KB
- 大小: 66.5 KB
- 大小: 37.2 KB
分享到:
相关推荐
如何处理listview的下载图片时候多线程并发问题,我这里参考了一些网络的资源和项目,总结了一下。希望能对有这些方面疑惑的朋友有所帮助。(listview和gridview,viewpager同一个道理,大家举一反三)。这里涉及到...
APK权限大全 - Android必懂知识 最无私的Android资料(书籍+代码)分享[总结] Android中文帮助教程(非常合适新手入门) android程序编写及调试新手入门 大家一起学Android(Windows篇) android入门与提高必看指南 ...
《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...
第5章 图片和按钮 30 第6章 日期和时间控件 34 第7章 进度条和滑动条 37 第8章 GridView和Gallery控件 43 第9章 AutoCompleteTextView提示输入建议 48 第10章 RatingBar评分组件 50 Android进阶讲课流程2.doc; 1. ...
而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏引擎设计、Android应用优化、OpcnGL等高级知识,最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言...
《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言 第一部分 准备篇 第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 1.1.3 ...
4.2.17 网格视图(GridView) 4.2.18 卷轴视图(ScrollView) 4.2.19 进度条(ProgressBar) 4.2.20 拖动条(SeekBar) 4.2.21 状态栏提示(Notification、NotificationManager) 4.2.22 对话框中的进度条...
3.1 Android的事件处理 145 3.2 基于监听的事件处理 145 3.2.1 事件监听的处理模型 145 3.2.2 事件和事件监听器 148 3.2.3 内部类作为事件监听器类 151 3.2.4 外部类作为事件监听器类 152 3.2.5 ...
3.1 Android的事件处理 145 3.2 基于监听的事件处理 145 3.2.1 事件监听的处理模型 145 3.2.2 事件和事件监听器 148 3.2.3 内部类作为事件监听器类 151 3.2.4 外部类作为事件监听器类 152 3.2.5 Activity本身作为...
3.1 Android的事件处理 145 3.2 基于监听的事件处理 145 3.2.1 事件监听的处理模型 145 3.2.2 事件和事件监听器 148 3.2.3 内部类作为事件监听器类 151 3.2.4 外部类作为事件监听器类 152 3.2.5 Activity本身作为...
网络图片加载和一些工具类,可以在有网络和无网络也正常使用,UI方面比较简单。 1、ScrollView 和 GridView 事件冲突 2、ScrollView 的滚动监听,窗体最顶端和最底端监听处理 3、Activity 与Fragment,Fragment与...
TiaraShowTime本项目代码十分简单,十分适合android新手学习在本项目中,你可以学习到以下知识点:1.使用fragment做页面转换,比activity的方式更加轻量级2.加载图片时,防止OOM的处理办法3.加载图片时,使用...
未来是移动互联网的时代,未来将是Windows Phone、Android、iphone三足鼎立的时代,掌握了移动开发的技能的人是就业市场的抢手货。微软推出的Windows Phone平台是微软在移动互联网时代的一个重量级产品,微软对于...