Ext.onReady(function(){
//先声明一些变量
var chooser, btn;
// 创建一个Button XHTML页面中必须有下列makup容器(style可根据需求修改):
// <div id="buttons" style="margin:20px;"></div>
btn = new Ext.Button('buttons', {
text: "Insert Image",
handler: choose //当按钮被按下的时候,接着发生的事情。注意是没有括号的函数名称
/**
* 在JS中, 一个函数有括号 和没有括号,是不同的。
* 通常来说括号()可理解为对函数的执行,表示一个动作;
* 使用不带括号的函数名称,则表示 “获取函数的地址”。
* 具体说明参阅微软文档:[url]http://jstang.5d6d.com/thread-64-1-1.html[/url]
*/
});
function choose(btn){
//判断是否已有chooser (Singleton)
if(!chooser){
chooser = new ImageChooser({
url:'get-images.php',
width:515,
height:400
});
}
chooser.show(btn.getEl(), insertImage); //show()为ImageChooser的方法
};
function insertImage(data){
//利用DomHelper动态加入元素,而这些都是div id="images“的子元素。
//img的url地址由参数传入的data中的url属性决定(data的类型为object)
//初始样式为外补丁10px,不可见
Ext.DomHelper.append('images', {
tag: 'img', src: data.url, style:'margin:10px;visibility:hidden;'
}, true).show(true);// 这里先隐藏在show()的目的是做出动画效果,true为带有动画。
btn.getEl().focus();
};
});
var ImageChooser = function(config){
// 创建一个对话框 -开始
/*
* config.id || Ext.id() 意思为:优先使用config.id;没有的话,用Ext.id()
* 【逻辑运算符”||“常用与设置默认值】
* Ext.id()方法能动态生成不重复的id,如:
Ext.id()
"ext-gen87"
Ext.id()
"ext-gen88"
Ext.id()
"ext-gen89"
*/
var dlg = new Ext.LayoutDialog(config.id || Ext.id(), {
autoCreate : true,
minWidth:400,
minHeight:300,
syncHeightBeforeShow: true,
shadow:true,
fixedcenter:true,
center:{autoScroll:false},
east:{split:true,initialSize:150,minSize:150,maxSize:250}
});
dlg.setTitle('Choose an Image');
dlg.getEl().addClass('ychooser-dlg');
dlg.addKeyListener(27, dlg.hide, dlg); // Esc键可隐藏
// 创建一个对话框 -结束
//在对话框上加入‘ok'按钮,
// this.ok指针指向该按钮对象(对象由addButton()执行后返回),
// 并分配一个callback( this.doCallback 作用:将选好的图片,加入背景中)
this.ok = dlg.addButton('OK', this.doCallback, this);
this.ok.disable();//先禁止,因为刚开始时数据加载中
/**
* 这里完成了两件事情:a.新建一个cancel按钮 b.设置这个按钮为默认的
*/
dlg.setDefaultButton(dlg.addButton('Cancel', dlg.hide, dlg));
dlg.on('show', this.load, this); //当对话框显示时,立刻加载数据
this.dlg = dlg;
var layout = dlg.getLayout();
// filter/sorting toolbar
this.tb = new Ext.Toolbar(this.dlg.body.createChild({tag:'div'}));
this.sortSelect = Ext.DomHelper.append(this.dlg.body.dom, {
tag:'select', children: [
{tag: 'option', value:'name', selected: 'true', html:'Name'},
{tag: 'option', value:'size', html:'File Size'},
{tag: 'option', value:'lastmod', html:'Last Modified'}
]
}, true);
this.sortSelect.on('change', this.sortImages, this, true);
this.txtFilter = Ext.DomHelper.append(this.dlg.body.dom, {
tag:'input', type:'text', size:'12'}, true);
this.txtFilter.on('focus', function(){this.dom.select();});
this.txtFilter.on('keyup', this.filter, this, {buffer:500});
this.tb.add('Filter:', this.txtFilter.dom, 'separator', 'Sort By:', this.sortSelect.dom);
// 在布局中加入一些面板panel beginUpdate()
layout.beginUpdate();
var vp = layout.add('center', new Ext.ContentPanel(Ext.id(), {
autoCreate : true,
toolbar: this.tb,
fitToFrame:true
}));
var dp = layout.add('east', new Ext.ContentPanel(Ext.id(), {
autoCreate : true,
fitToFrame:true
}));
layout.endUpdate();
// 在布局中加入一些面板panel endUpdate()
var bodyEl = vp.getEl();
bodyEl.appendChild(this.tb.getEl());
//
/*vp-->包含this.tb(工具条)和 viewBody(视图view的主体)
* 试比较appendChild()和createChild()的区别
* appendChild()->"Appends the passed element(s) to this element "
*
* 加入传入的element(s)到该element
* @param {String/HTMLElement/Array/Element/CompositeElement} el
* @return {Ext.Element} this
*
* createChild()-->"Creates the passed DomHelper config and
* appends it to this element or optionally inserts it before the passed child element. "
*/
var viewBody = bodyEl.createChild({tag:'div', cls:'ychooser-view'});
vp.resizeEl = viewBody;
this.detailEl = dp.getEl();
// 创建缩略图的HTML模板
this.thumbTemplate = new Ext.Template(
'<div class="thumb-wrap" id="{name}">' +
'<div class="thumb"><img src="{url}" title="{name}"></div>' +
'<span>{shortName}</span></div>'
);
this.thumbTemplate.compile(); //编译DOM加速
// 创建详细资料的HTML模板
this.detailsTemplate = new Ext.Template(
'<div class="details"><img src="{url}"><div class="details-info">' +
'<b>Image Name:</b>' +
'<span>{name}</span>' +
'<b>Size:</b>' +
'<span>{sizeString}</span>' +
'<b>Last Modified:</b>' +
'<span>{dateString}</span></div></div>'
);
this.detailsTemplate.compile(); //编译DOM加速
//初始化view视图
this.view = new Ext.JsonView(viewBody, this.thumbTemplate, {
singleSelect: true,
jsonRoot: 'images',
emptyText : '<div style="padding:10px;">No images match the specified filter</div>'
});
this.view.on('selectionchange', this.showDetails, this, {buffer:100});//事件触发后延时100才执行
this.view.on('dblclick', this.doCallback, this); //双击图片,加入背景中
this.view.on('loadexception', this.onLoadException, this);
this.view.on('beforeselect', function(view){
return view.getCount() > 0;
});
//将配置项对象的属性 和this合二为一
Ext.apply(this, config, {
width: 540, height: 400
});
//格式化kb的小函数
var formatSize = function(size){
if(size < 1024) {
return size + " bytes";
} else {
return (Math.round(((size*10) / 1024))/10) + " KB";
}
};
// 创建一个lookup对象,用查找图片名时用
var lookup = {};
//这里override了prepareData(),可在模板中使用自定义的属性
this.view.prepareData = function(data){
data.shortName = data.name.ellipse(15);
data.sizeString = formatSize(data.size);
data.dateString = new Date(data.lastmod).format("m/d/Y g:i a");
lookup[data.name] = data;//保存到lookup的hash table中
return data;
};
this.lookup = lookup;//成为对象的一员
/*
* this.width, this.height哪里来?由config配置项对象获得(前面已经apply())
*/
dlg.resizeTo(this.width, this.height);
this.loaded = false;
};
相关推荐
Android 设备的屏幕尺寸和分辨率差异较大,因此 ImageChooser 需要能够适配各种设备。在设计 UI 时,需要考虑响应式布局,确保在不同设备上都能正常显示。同时,加载图片时要考虑性能优化,避免内存溢出,例如使用 ...
/**图片加载的占位图片*/public static int placeResId=R.mipmap.image_chooser_placeholder;/**图片加载的动画*/public static int loadAnimateResId=0;/**选中图片的滤镜颜色*/public static int ...
AutoJs源码-file_chooser_dialog。本资源购买前提醒:本源码都是实际autojs项目模板,安装好autojs直接运行即可打开。1、支持低版本autojs。2、资源仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您自己...
2. **拖放支持**: 支持拖放操作是`JImageFileChooser` 的另一大优点。用户可以方便地通过鼠标拖动图片从一个位置到另一个位置,如从文件选择器到某个容器(如JPanel或JFrame),这对于文件管理和应用内部操作尤其...
标题“im-chooser-0.5.3-1.fc8.i386”指的是一个特定版本的输入法选择器软件,适用于Linux操作系统中的Fedora 8(FEDORA9的错误描述可能是笔误)。这个软件的主要功能是为用户提供一个界面,以便在多种不同的输入法...
【Android应用源码之TXT文本阅读器源码.zip】是一个包含了一个简单的Android应用程序源代码的压缩包,这个程序主要用于阅读TXT格式的文本文件。通过分析这个应用,我们可以深入理解Android应用开发中的几个关键知识...
Pantone Color Chooser是一款专为纺织业设计的色彩选择工具,它以其直观易用的特点,为设计师们提供了一个高效、准确的色彩参考平台。 Pantone色卡是全球公认的色彩标准,被广泛应用于各行各业,尤其是纺织品设计。...
4. **优化性能**:分析源码以提高jqGrid在大数据量下的加载速度和用户体验,例如,理解如何实现分页和懒加载机制。 5. **美化界面**:通过修改CSS文件,可以调整表格的样式,使其符合现代Web设计标准。 总结来说,...
本项目源码提供了实现这一功能的详细示例,对于学习和理解Android编程,特别是涉及电话服务API的使用,有着极大的帮助。以下是这个"android打电话源码.zip"中的关键知识点: 1. **权限管理**: 在AndroidManifest....
在Android平台上,文件选择器管理器("android the file chooser manager")是一个至关重要的组件,它允许用户在应用中选择本地存储的文件。文件选择器是Android应用与用户交互,处理文件操作的关键部分,比如读取、...
DNS Chooser是一款实用工具,主要用于帮助用户选择和切换不同的DNS(域名系统)服务器。在日常网络使用中,DNS是互联网的重要组成部分,它负责将我们输入的网址(如www.example.com)转换为对应的IP地址(如192.168....
48.Chooser CompoundChooserandStraddle1114.xls
离线安装包,亲测可用
2. **源码结构分析** - `AppChooser-master`: 这是源码的主要目录,可能包含项目的主模块,包括Java源代码、布局XML文件、资源文件等。 - `说明.htm`: 这可能是关于项目的一份简要说明,涵盖了如何编译、运行以及...
if (requestCode == REQUEST_IMAGE_CHOOSER && resultCode == RESULT_OK) { Uri selectedImage = data.getData(); // 使用Uri加载图片,例如使用 Glide 或 Picasso 库 } } ``` 最后,裁剪功能通常使用第三方库...
CM魅族主题是一款专为魅族手机用户设计的个性化主题应用,其中包含了Theme Chooser功能。这个主题包不仅提供了丰富的视觉样式,还允许用户自定义手机界面,打造出独特的操作体验。下面将详细介绍CM魅族主题及其相关...
JFileChooser chooser1 = new JFileChooser(); int state = chooser1.showOpenDialog(null); chooser1.show(); String filepath=null; boolean flag = true; if (chooser1.getSelectedFile() != null ...
Flutter的桌面嵌入 该项目最初是为了开发Windows,macOS和Linux嵌入式而创建的。 自那以后,这项工作已成为Flutter的一部分,这里剩下的只是实验性的,早期阶段的桌面。 如果要在台式机上开始使用Flutter,现在开始...