❶ java 跳棋的程序 急~~
先导入三个按钮图片
正常显示的图片"Begin1.jpg"
鼠标移动到按钮上时显示的图片"Begin2.jpg"
按下鼠标时显示的图片"Begin1.jpg"
final ImageLoader imageBegin1 = new ImageLoader(sShell.getDisplay(), "Begin1.jpg");
final ImageLoader imageBegin2 = new ImageLoader(sShell.getDisplay(), "Begin2.jpg");
final ImageLoader imageBegin3 = new ImageLoader(sShell.getDisplay(),"Begin1.jpg");
创建按钮
lblBegin = new Label(parent, SWT.NO_BACKGROUND);
lblBegin.setImage(imageBegin1.getImage());
lblBegin.setBounds(70, 40, 75, 38);
为按钮各事件写入代码
lblBegin.addMouseTrackListener(new MouseTrackAdapter() {
public void mouseEnter(MouseEvent e) { //鼠标移动到按钮上方
lblBegin.setImage(imageBegin2.getImage());
}
public void mouseExit(MouseEvent e) { //鼠标从按钮上方移开
lblBegin.setImage(imageBegin1.getImage());
}
});
lblBegin.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
if (e.button == 1) {//按下鼠标左键
lblBegin.setImage(imageBegin3.getImage()); //在这里写入单击事件代码
}
}
public void mouseUp(MouseEvent e) {
if (e.button == 1) {//释放鼠标左键
lblBegin.setImage(imageBegin2.getImage());
}
}
});
如图所示,当X坐标为1时,Y的坐标只能为5,当X坐标为2时,Y的坐标可以5或6。于是我们建立一个数组:
final static private int[][] pos = {
{5,5}, //X坐标为1,Y的上限是5,下限是5
{5,6}, //X坐标为2,Y的上限是5,下限是6
{5,7}, //X坐标为3,Y的上限是5,下限是7
{5,8}, //X坐标为4,Y的上限是5,下限是8
{1,13}, //X坐标为5,Y的上限是1,下限是13
{2,13}, //6
{3,13}, //7
{4,13}, //8
{5,13}, //9
{5,14}, //10
{5,15}, //11
{5,16}, //12
{5,17}, //13
{10,13}, //14
{11,13}, //15
{12,13}, //16
{13,13}, //17
};
在Position类中IsLegalPosition函数可以确定一个坐标是否合法
public static boolean IsLegalPosition(int x, int y) {
if ((x < 1) || (x > 17)) {
return false;
}
if ((y < pos[x - 1][0]) || (y > pos[x - 1][1])) {
return false;
}
return true;
}
3. 棋盘类(ChessBoard)中棋子和坐标的索引关系
棋盘中所有Chess集合
private Chess[] chesses = null;//所有棋子对象都保存这个数组当中
下面函数可以根据索引号返回棋子对象
public Chess getChess(int index) {
return chesses[index];
}
棋子和坐标的对应关系
private Position[] chessesPosition = null;//所有棋子坐标都保存在这个数组当中
下面函数可以根据棋子对象或棋子索引号返回坐标
public Position getPosition(Chess chess) {
return chessesPosition[chess.getindex()];
}
public Position getPosition(int index) {
return chessesPosition[index];
}
坐标和棋子的对应关系
private Chess[][] chessesIndex = new Chess[17][17];//数组保存了17*17个棋子对象指针
下面函数可以根据棋子坐标返回该位置上的棋子,如果没有棋子返回Null
public Chess getChess(Position position) {
if (position == null){
return null;
}
return chessesIndex[position.getx() - 1][position.gety() - 1];
}
❷ universal imageloader 怎么修改源码
android Universal Image Loader 源码分析
本文为 Android 开源项目源码解析 中 Android Universal Image Loader 部分
项目地址:Android-Universal-Image-Loader,分析的版本:eb794c3,Demo 地址:UIL Demo
分析者:huxian99,校对者:Grumoon、Trinea,校对状态:完成
1. 功能介绍
1.1 Android Universal Image Loader
Android Universal Image Loader 是一个强大的、可高度定制的图片缓存,本文简称为UIL。
简单的说 UIL 就做了一件事——获取图片并显示在相应的控件上。
1.2 基本使用
1.2.1 初始化
添加完依赖后在Application或Activity中初始化ImageLoader,如下:
public class YourApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
// 添加你的配置需求
.build();
ImageLoader.getInstance().init(configuration);
}
}
其中 configuration 表示ImageLoader的配置信息,可包括图片最大尺寸、线程池、缓存、下载器、解码器等等。
1.2.2 Manifest 配置
<manifest>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name=".YourApplication"
…… >
……
</application>
</manifest>
添加网络权限。如果允许磁盘缓存,需要添加写外设的权限。
1.2.3 下载显示图片
下载图片,解析为 Bitmap 并在 ImageView 中显示。
imageLoader.displayImage(imageUri, imageView);
下载图片,解析为 Bitmap 传递给回调接口。
imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
// 图片处理
}
});
以上是简单使用,更复杂 API 见本文详细设计。
1.3 特点
可配置度高。支持任务线程池、下载器、解码器、内存及磁盘缓存、显示选项等等的配置。
包含内存缓存和磁盘缓存两级缓存。
支持多线程,支持异步和同步加载。
支持多种缓存算法、下载进度监听、ListView 图片错乱解决等。
2. 总体设计
2.1. 总体设计图
上面是 UIL 的总体设计图。整个库分为ImageLoaderEngine,Cache及ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor五大模块,其中Cache分为MemoryCache和DiskCache两部分。
简单的讲就是ImageLoader收到加载及显示图片的任务,并将它交给ImageLoaderEngine,ImageLoaderEngine分发任务到具体线程池去执行,任务通过Cache及ImageDownloader获取图片,中间可能经过BitmapProcessor和ImageDecoder处理,最终转换为Bitmap交给BitmapDisplayer在ImageAware中显示。
2.2. UIL 中的概念
简单介绍一些概念,在4. 详细设计中会仔细介绍。
ImageLoaderEngine:任务分发器,负责分发LoadAndDisplayImageTask和ProcessAndDisplayImageTask给具体的线程池去执行,本文中也称其为engine,具体参考4.2.6 ImageLoaderEngine.java。
ImageAware:显示图片的对象,可以是ImageView等,具体参考4.2.9 ImageAware.java。
ImageDownloader:图片下载器,负责从图片的各个来源获取输入流, 具体参考4.2.22 ImageDownloader.java。
Cache:图片缓存,分为MemoryCache和DiskCache两部分。
MemoryCache:内存图片缓存,可向内存缓存缓存图片或从内存缓存读取图片,具体参考4.2.24 MemoryCache.java。
DiskCache:本地图片缓存,可向本地磁盘缓存保存图片或从本地磁盘读取图片,具体参考4.2.38 DiskCache.java。
ImageDecoder:图片解码器,负责将图片输入流InputStream转换为Bitmap对象, 具体参考4.2.53 ImageDecoder.java。
BitmapProcessor:图片处理器,负责从缓存读取或写入前对图片进行处理。具体参考4.2.61 BitmapProcessor.java。
BitmapDisplayer:将Bitmap对象显示在相应的控件ImageAware上, 具体参考4.2.56 BitmapDisplayer.java。
LoadAndDisplayImageTask:用于加载并显示图片的任务, 具体参考4.2.20 LoadAndDisplayImageTask.java。
ProcessAndDisplayImageTask:用于处理并显示图片的任务, 具体参考4.2.19 ProcessAndDisplayImageTask.java。
DisplayBitmapTask:用于显示图片的任务, 具体参考4.2.18 DisplayBitmapTask.java。
3. 流程图
上图为图片加载及显示流程图,在uil库中给出,这里用中文重新画出。
4. 详细设计
4.1 类关系图
4.2 核心类功能介绍
4.2.1 ImageLoader.java
图片加载器,对外的主要 API,采取了单例模式,用于图片的加载和显示。
主要函数:
(1). getInstance()
得到ImageLoader的单例。通过双层是否为 null 判断提高性能。
(2). init(ImageLoaderConfiguration configuration)
初始化配置参数,参数configuration为ImageLoader的配置信息,包括图片最大尺寸、任务线程池、磁盘缓存、下载器、解码器等等。
实现中会初始化ImageLoaderEngine engine属性,该属性为任务分发器。
(3). displayImage(String uri, ImageAware imageAware, DisplayImageOptions options, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)
加载并显示图片或加载并执行回调接口。ImageLoader 加载图片主要分为三类接口:
displayImage(…) 表示异步加载并显示图片到对应的ImageAware上。
loadImage(…) 表示异步加载图片并执行回调接口。
loadImageSync(…) 表示同步加载图片。
以上三类接口最终都会调用到这个函数进行图片加载。函数参数解释如下:
uri: 图片的 uri。uri 支持多种来源的图片,包括 http、https、file、content、assets、drawable 及自定义,具体介绍可见ImageDownloader。
imageAware: 一个接口,表示需要加载图片的对象,可包装 View。
options: 图片显示的配置项。比如加载前、加载中、加载失败应该显示的占位图片,图片是否需要在磁盘缓存,是否需要在内存缓存等。
listener: 图片加载各种时刻的回调接口,包括开始加载、加载失败、加载成功、取消加载四个时刻的回调函数。
progressListener: 图片加载进度的回调接口。
函数流程图如下:
4.2.2 ImageLoaderConfiguration.java
ImageLoader的配置信息,包括图片最大尺寸、线程池、缓存、下载器、解码器等等。
主要属性:
(1). Resources resources
程序本地资源访问器,用于加载DisplayImageOptions中设置的一些 App 中图片资源。
(2). int maxImageWidthForMemoryCache
内存缓存的图片最大宽度。
(3). int maxImageHeightForMemoryCache
内存缓存的图片最大高度。
(4). int maxImageWidthForDiskCache
磁盘缓存的图片最大宽度。
(5). int maxImageHeightForDiskCache
磁盘缓存的图片最大高度。
(6). BitmapProcessor processorForDiskCache
图片处理器,用于处理从磁盘缓存中读取到的图片。
(7). Executor taskExecutor
ImageLoaderEngine中用于执行从源获取图片任务的 Executor。
(18). Executor taskExecutorForCachedImages
ImageLoaderEngine中用于执行从缓存获取图片任务的 Executor。
(19). boolean customExecutor
用户是否自定义了上面的 taskExecutor。
(20). boolean customExecutorForCachedImages
用户是否自定义了上面的 taskExecutorForCachedImages。
(21). int threadPoolSize
上面两个默认线程池的核心池大小,即最大并发数。
(22). int threadPriority
上面两个默认线程池的线程优先级。
(23). QueueProcessingType tasksProcessingType
上面两个默认线程池的线程队列类型。目前只有 FIFO, LIFO 两种可供选择。
(24). MemoryCache memoryCache
图片内存缓存。
(25). DiskCache diskCache
图片磁盘缓存,一般放在 SD 卡。
(26). ImageDownloader downloader
图片下载器。
(27). ImageDecoder decoder
图片解码器,内部可使用我们常用的BitmapFactory.decode(…)将图片资源解码成Bitmap对象。
(28). DisplayImageOptions defaultDisplayImageOptions
图片显示的配置项。比如加载前、加载中、加载失败应该显示的占位图片,图片是否需要在磁盘缓存,是否需要在内存缓存等。
(29). ImageDownloader networkDeniedDownloader
不允许访问网络的图片下载器。
(30). ImageDownloader slowNetworkDownloader
慢网络情况下的图片下载器。
4.2.3 ImageLoaderConfiguration.Builder.java 静态内部类
Builder 模式,用于构造参数繁多的ImageLoaderConfiguration。
其属性与ImageLoaderConfiguration类似,函数多是属性设置函数。
主要函数及含义:
(1). build()
按照配置,生成 ImageLoaderConfiguration。代码如下:
public ImageLoaderConfiguration build() {
();
return new ImageLoaderConfiguration(this);
}
(2). ()
初始化值为null的属性。若用户没有配置相关项,UIL 会通过调用DefaultConfigurationFactory中的函数返回一个默认值当配置。
taskExecutorForCachedImages、taskExecutor及ImageLoaderEngine的taskDistributor的默认值如下:
parameters
taskDistributor
taskExecutorForCachedImages/taskExecutor
corePoolSize 0 3
maximumPoolSize Integer.MAX_VALUE 3
keepAliveTime 60 0
unit SECONDS MILLISECONDS
workQueue SynchronousQueue LIFOLinkedBlockingDeque / LinkedBlockingQueue
priority 5 3
diskCacheFileNameGenerator默认值为HashCodeFileNameGenerator。
memoryCache默认值为LruMemoryCache。如果内存缓存不允许缓存一张图片的多个尺寸,则用FuzzyKeyMemoryCache做封装,同一个图片新的尺寸会覆盖缓存中该图片老的尺寸。
diskCache默认值与diskCacheSize和diskCacheFileCount值有关,如果他们有一个大于 0,则默认为LruDiskCache,否则使用无大小限制的UnlimitedDiskCache。
downloader默认值为BaseImageDownloader。
decoder默认值为BaseImageDecoder。
详细及其他属性默认值请到DefaultConfigurationFactory中查看。
(3). ()
设置内存缓存不允许缓存一张图片的多个尺寸,默认允许。
后面会讲到 View 的 getWidth() 在初始化前后的不同值与这个设置的关系。
(4). diskCacheSize(int maxCacheSize)
设置磁盘缓存的最大字节数,如果大于 0 或者下面的maxFileCount大于 0,默认的DiskCache会用LruDiskCache,否则使用无大小限制的UnlimitedDiskCache。
(5). diskCacheFileCount(int maxFileCount)
设置磁盘缓存文件夹下最大文件数,如果大于 0 或者上面的maxCacheSize大于 0,默认的DiskCache会用LruDiskCache,否则使用无大小限制的UnlimitedDiskCache。
4.2.4 ImageLoaderConfiguration.NetworkDeniedImageDownloader.java 静态内部类
不允许访问网络的图片下载器,实现了ImageDownloader接口。
实现也比较简单,包装一个ImageDownloader对象,通过在 getStream(…) 函数中禁止 Http 和 Https Scheme 禁止网络访问,如下:
@Override
public InputStream getStream(String imageUri, Object extra) throws IOException {
switch (Scheme.ofUri(imageUri)) {
case HTTP:
case HTTPS:
throw new IllegalStateException();
default:
return wrappedDownloader.getStream(imageUri, extra);
}
}
4.2.5 ImageLoaderConfiguration.SlowNetworkImageDownloader.java 静态内部类
慢网络情况下的图片下载器,实现了ImageDownloader接口。
通过包装一个ImageDownloader对象实现,在 getStream(…) 函数中当 Scheme 为 Http 和 Https 时,用FlushedInputStream代替InputStream处理慢网络情况,具体见后面FlushedInputStream的介绍。
4.2.6 ImageLoaderEngine.java
LoadAndDisplayImageTask和ProcessAndDisplayImageTask任务分发器,负责分发任务给具体的线程池。
主要属性:
(1). ImageLoaderConfiguration configuration
ImageLoader的配置信息,可包括图片最大尺寸、线程池、缓存、下载器、解码器等等。
(2). Executor taskExecutor
用于执行从源获取图片任务的 Executor,为configuration中的 taskExecutor,如果为null,则会调用DefaultConfigurationFactory.createExecutor(…)根据配置返回一个默认的线程池。
(3). Executor taskExecutorForCachedImages
用于执行从缓存获取图片任务的 Executor,为configuration中的 taskExecutorForCachedImages,如果为null,则会调用DefaultConfigurationFactory.createExecutor(…)根据配置返回一个默认的线程池。
(4). Executor taskDistributor
任务分发线程池,任务指LoadAndDisplayImageTask和ProcessAndDisplayImageTask,因为只需要分发给上面的两个 Executor 去执行任务,不存在较耗时或阻塞操作,所以用无并发数(Int 最大值)限制的线程池即可。
(5). Map cacheKeysForImageAwares
ImageAware与内存缓存 key 对应的 map,key 为ImageAware的 id,value 为内存缓存的 key。
(6). Map uriLocks
图片正在加载的重入锁 map,key 为图片的 uri,value 为标识其正在加载的重入锁。
(7). AtomicBoolean paused
是否被暂停。如果为true,则所有新的加载或显示任务都会等待直到取消暂停(为false)。
(8). AtomicBoolean networkDenied
是否不允许访问网络,如果为true,通过ImageLoadingListener.onLoadingFailed(…)获取图片,则所有不在缓存中需要网络访问的请求都会失败,返回失败原因为网络访问被禁止。
(9). AtomicBoolean slowNetwork
是否是慢网络情况,如果为true,则自动调用SlowNetworkImageDownloader下载图片。
(10). Object pauseLock
❸ Android实现图库功能,查看本应用drawable下的所有图片,且能左右滑动切换上一页或下一页图片
使用ImageLoader
源码地址
https://github.com/nostra13/Android-Universal-Image-Loader
可以通过这个框架来加载以下类型的图片
"http://site.com/image.png" // from Web
"file:///mnt/sdcard/image.png" // from SD card
"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)
"content://media/external/images/media/13" // from content provider
"content://media/external/video/media/13" // from content provider (video thumbnail)
"assets://image.png" // from assets
"drawable://" + R.drawable.img // from drawables (non-9patch images)
官网有例子,使用非常简单,一行代码搞定
❹ img src 图片预览的问题 附源码
浏览器安全性已经大大提高,要实现图片上传预览不是那么简单了
不过有很多变通或先进的方法来实现
例如ie7/ie8的滤镜预览法,firefox3的getAsDataURL方法
具体可以参考这个图片上传预览效果