`
duguyidao
  • 浏览: 137416 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

Android 关于GridView 以及图片处理一些知识

阅读更多
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
分享到:
评论
3 楼 鱼在陆地上跑 2012-07-31  
String imagePath = list.get(position).get("path");  此处的path可以是任务的路径?好像不行,我如果想实现点击链接到链接到不同的地址,在此处的话怎么绑定
2 楼 W89910410 2011-09-25  
Javafedora 写道
能给一下XML文件不??

能不能给下xml文件
1 楼 Javafedora 2011-07-23  
能给一下XML文件不??

相关推荐

    android中listview,gridview加载图片的线程并发解决方案

    如何处理listview的下载图片时候多线程并发问题,我这里参考了一些网络的资源和项目,总结了一下。希望能对有这些方面疑惑的朋友有所帮助。(listview和gridview,viewpager同一个道理,大家举一反三)。这里涉及到...

    android开发资料大全

    APK权限大全 - Android必懂知识 最无私的Android资料(书籍+代码)分享[总结] Android中文帮助教程(非常合适新手入门) android程序编写及调试新手入门 大家一起学Android(Windows篇) android入门与提高必看指南 ...

    Android开发案例驱动教程 配套代码

    《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...

    android知识大总结【邯院】

    第5章 图片和按钮 30 第6章 日期和时间控件 34 第7章 进度条和滑动条 37 第8章 GridView和Gallery控件 43 第9章 AutoCompleteTextView提示输入建议 48 第10章 RatingBar评分组件 50 Android进阶讲课流程2.doc; 1. ...

    Android应用开发揭秘pdf高清版

    而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏引擎设计、Android应用优化、OpcnGL等高级知识,最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言...

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 ...

    《Android应用开发揭秘》源码

     4.2.17 网格视图(GridView)  4.2.18 卷轴视图(ScrollView)  4.2.19 进度条(ProgressBar)  4.2.20 拖动条(SeekBar)  4.2.21 状态栏提示(Notification、NotificationManager)  4.2.22 对话框中的进度条...

    疯狂Android讲义源码

     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 ...

    疯狂Android讲义.part2

    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本身作为...

    疯狂Android讲义.part1

    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本身作为...

    AprilKuatangWeather

    网络图片加载和一些工具类,可以在有网络和无网络也正常使用,UI方面比较简单。 1、ScrollView 和 GridView 事件冲突 2、ScrollView 的滚动监听,窗体最顶端和最底端监听处理 3、Activity 与Fragment,Fragment与...

    TiaraShowTime

    TiaraShowTime本项目代码十分简单,十分适合android新手学习在本项目中,你可以学习到以下知识点:1.使用fragment做页面转换,比activity的方式更加轻量级2.加载图片时,防止OOM的处理办法3.加载图片时,使用...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    未来是移动互联网的时代,未来将是Windows Phone、Android、iphone三足鼎立的时代,掌握了移动开发的技能的人是就业市场的抢手货。微软推出的Windows Phone平台是微软在移动互联网时代的一个重量级产品,微软对于...

Global site tag (gtag.js) - Google Analytics