您的位置:首页 > 移动开发 > Android开发

从0开始写个Android相册应用(1)

2012-01-30 12:40 316 查看
  相册这玩意儿用AS写过几个,这回用android写,目前对于java的理解完全是根据as来的,对于android几乎是一窍不通,从没做过这方面的项目,公司有个后台同事稍微懂点,本打算跟着他学学的,在他刚教会我安装android开发环境后,他就辞职闪人了。好吧,买书自学。找到了当初在西安一个人拿着殿堂之路死磕的感觉。

  技术要点:

  1,如何创建一个android项目;

  2,如何创建一个可见的显示对象类;

  3,如何让显示对象从A点移动到B点,且可控制速度;

  4,如何访问本地文件,包括手机存储空间和SD卡存储空间;

  5,如何把本地路径的图片加载到自己应用的内存空间里;

  6,如何把图片添加到显示对象作为其子对象;

  7,如果通过网络加载服务器里存储的图片。

==================================================================

1,eclipse安装好ADT和Android SDK后,就可创建android项目,Ctrl+N ,选择"Android"目录,第一个是"Android Icon Set",这个东西貌似是专门给自己的应用创建logo Icon的,不管他,点第二个,新建“Android Project”,这里用的android版本是2.3.3。

项目目录下默认有src,gen,android2.3.3,assets,bin,res这六个目录,和AndroidManifest.xml ,proguard.cfg, progect.properties这三个文件。

(1)src:

项目里所有代码都在这里,由于创建项目时勾选了”Create Activity“,会自动创建一个继承自Activity的类,这里叫    PhotoAlbumActivity.java。

   Activity:

   An
Activity
is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. An activity can start other activities, including activities that live in separate applications.

   官方文档里的原话,大意是Activity是一个供用户交互的应用组件,一个用户界面。比如用户拨号,拍照,发送邮件或者查看地图。可以通过一个activity对象启动其他的activiety对象,甚至是存在与其他独立的应用里的activity对象。

(2)gen:

  项目一旦编译之后就会在gen目录里创建一个类R.java,此类对应的是res目录里所有的资源文件,项目中新添加一张图放到了res-drawable目录后就会在R.java里自动生成一个新的对应索引。项目中使用资源的地方可便捷地通过R.java使用。

(3)Android 2.2.3

   android库目录,android.jar文件指向Android SDK,所有官方API

(4)assets

  存放外部资源,和同样是存放资源的res目录的区别就在于res里的资源文件会自动在R.java里生成对应资源ID,asset则不会。

(5)bin

  项目编译成功后会在bin里面存放用到了的资源,以及生成一个apk文件。

(6)res

  res,用来存放项目中用到的资源文件,有5个子目录:

  drawable_hdpi,存放高分辨的图片,WVGA(480*800),FWVGA(480*854)

  drawable_ldpi,存放中等分辨率的图片,HVGA(320*480)

  drawable_mdpi,存放低分辨率的图片,QVGA(240*320)

  layout,存放布局文件

  values,放置项目需要显示的各种文字,颜色等文字信息。

(7)AndroidManifest.xml

  当前项目的配置文件,包含有项目中用到的Activity,如果新添加了一个Activity,需要在这个进行相应的配置才能被调用。

(8)proguard.cfg

  貌似是一个用与混淆代码放置反编译的东西

(9)project.properies

  貌似是跟android版本信息有关。

=================================================================

2,要想创建一个显示对象,就不得不说说三种常用视图类,View,surfaceView,GLSurfaceView

view,内置画布canvas,提供图形绘制函数,触屏事件,按键事件函数等;

surfaceView,继承自view.

====================================

2012年,1月24日大年初二晚,继续写这篇文章。之前写的技术要点有些了解了有些还没了解。

之前偶尔抽时间在网上找了些资料,目前算是可以复制网上的代码搞个根据设定的线程数来加载图片,代码还真是好多地方都没看懂。这算是之前的测试结果把。

DrawableLoader

package com.jd.net;

import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.graphics.drawable.Drawable;
import android.os.Handler;

public class DrawableLoader
{
public Map<String, SoftReference<Drawable>> imageCache =
new HashMap<String, SoftReference<Drawable>>();

private ExecutorService executorService = Executors.newFixedThreadPool(2);

private final Handler handler = new Handler();

public DrawableLoader()
{

}

public Drawable loadDrawable(final String imageUrl,
final ImageCallback callback)
{
if(imageCache.containsKey(imageUrl))
{
SoftReference<Drawable>  softReference = imageCache.get(imageUrl);
if(softReference.get() != null)
{
return softReference.get();
}
}

executorService.submit(new Runnable() {

public void run() {
// TODO Auto-generated method stub
try
{
final Drawable drawable = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
handler.post(new Runnable() {

public void run() {
// TODO Auto-generated method stub
callback.imageLoaded(drawable);
}
});
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
});
return null;
}

protected Drawable loadImageFromUrl(String imageUrl)
{
try
{
//            SystemClock.sleep(3000);
return Drawable.createFromStream(new URL(imageUrl).openStream(),"image.png");
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}

public interface ImageCallback
{
public void imageLoaded(Drawable imageDrawable);
}
}


接下来的测试目标步骤:

  1,根据给定的url,加载一张图片到一个ImageView对象里,并且显示出来;

  2,让这个ImageView对象从一个点移动到另一个点;

  3,让这个ImageView对象在加载好后就显示为小图,点击后等比例放大

===========================================

昨天也就是1月23号在网上找了好久资料发现无法在不使用layout配置文件的情况下把一个ImageView对像添加到了View对象里。用位图Bitmap的话倒是可以通过android.graphics.Canvas的drawBitmap方法把一张bitmap添加到view, 然后发现之前利用线程加载图片是用的android.graphics.drawable.Drawable,而网上有提到Bitmap和Drawable这个抽象类的互相转换,那么就不用ImageView而改用Bitmap试试。

======================================

1月30号

到目前为止可以从网上加载一张位图显示到surfaceview里了。通过一个Thread可以让这张图片移动,每一帧都重绘canvas.drawBitmap()以达到移动的目的。

BitmapTool

package com.jd.view;

import android.graphics.Bitmap;

import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

public class BitmapTool
{
public static Bitmap drawableToBitmap(Drawable drawable)
{
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
return bitmapDrawable.getBitmap();
}
}


总结一下,根据这几天在网上和书上的有限的资料里了解到,要想改变位图的位置,大小,并不是像ActionScrtipt里bitmap.x,bitmap.y,bitmap.scaleX,bitmap.scaleY等等属性直接改变位图的显示属性,而是要通过代码反复重绘位图所在的view的画布canvas,官方文档没有怎么瞅,不知是否有更方便的方法。

哈,虽说AS把显示对象封装地比较好用,什么.addChild,.x,.y,.scale之类的,但底层我觉得也因该是一样的机制,重绘呗。

留下来两个问题:

1,AS里一张位图被添加到舞台上,若再添加一张位图并想让前者不可见,那么就要把前者removeChild掉,而android里重绘时直接给canvas绘制一下颜色就貌似移除之前的位图了,然后再绘制新图。前面的位图不可见了,那么这时前一张位图所占的内存是否可以被自动回收了呢,是否要通过代码做些销毁处理?

2,Canvas,一个SurfaceView是否就只有一张画图?如果要在一个Activity里显示多张位图,那么这些位图是必须在同一个canvas里?还是可以被绘制在不同的canvas里?canvas是否有x,y,width,height等属性呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: