首页 文章 精选 留言 我的

精选列表

搜索[UI库],共10000篇文章
优秀的个人博客,低调大师

Ant Design 4.17.0-alpha.6 发布,企业级 UI 设计语言和 React 实现

Ant Design 4.17.0-alpha.6现已发布,主要变化如下: 修复 InputNumber 操作杆箭头未居中对齐的问题。#32409 修复多次调用 Notification 时closeIcon配置会被覆盖的问题。#32359 修复 Button 有icon和href时的对齐问题。#32373 优化 Drawer 弹出动画。#32342 修复 Mentions 在 Form 下错误样式丢失的问题。#32385 TypeScript 修复 ConfigProvider 中getPopupContainer的参数类型。#32406 更新说明:https://github.com/ant-design/ant-design/releases/tag/4.17.0-alpha.

优秀的个人博客,低调大师

Ant Design 4.17.0-alpha.4 发布,企业级 UI 设计语言和 React 实现

Ant Design 4.17.0-alpha.4现已发布,主要变化如下: 修复英文国际化文案Ok为OK。#32259 修复antd.variable.less编译时会混入默认主题配置的问题。#32279 Button 修复 Buttonghost鼠标悬停样式。#32289 修复 Button 配置loading时,无法触发 Tooltip 的问题。#32158 Table 修复 Table 不支持ref的问题。#32136 Table 移除 IE11 下sticky的相关样式以解决布局问题。#32177 优化 Table 排序图标边距问题。#32172 修复 Switchloading按钮位置不正确的问题。#32216 修复 Grid Colflex在内容过长的时候缩放失效的问题。#32160 RTL 优化 Alert 关闭按钮在 RTL 模式下的显示。#32286 优化 Table 表头操作按钮在 RTL 模式下显示。#32283 优化 Collapse 按钮在 RTL 模式下位置显示。#32282 优化 Badge 数字在 RTL 模式下显示和动画。#32281 优化 InputNumber 操作栏 RTL 模式下边框样式。#32272 优化 Dropdown RTL 模式下 icon 显示。#32271 TypeScript 修复 Switchid属性定义。#32237 更新说明:https://github.com/ant-design/ant-design/releases/tag/4.17.0-alpha.4

优秀的个人博客,低调大师

小程序商城模块 Oejia_weshop v0.1.5 发布,新版的 UI 系列优化

概述 oejia_weshop 是 Odoo 对接微信小程序实现的商城应用。 如果您使用odoo的销售模块,而想要在微信小程序上实现自己的商城卖odoo里的商品,装上 oejia_weshop 模块即可。 如果您想要搭建一套进销存(ERP)系统并实现对接微信商城的管理,用 Odoo + oejia_weshop 模块,是个快捷方法。 v0.1.5 修复订单送货地址与odoo的一致性 订单操作按钮状态及相关试图优化 修复订单时间相关时间字段时区问题 增加订单创建及商城查询接口函数化 支持继承定制 增加公告功能,支持归档操作 适配新版客户端,省市区从后端接口获取 后端接口用户识别支持session模式 banner功能完善,增加位置选项 推荐的商品支持在首页轮播图展示 商品分类增加图标/图片设置功能 小程序端图文详情支持从电商描述取 产品扩展视图优化 修改商品分类时更新分类级数的优化 效果 首页 支持三级分类导航 主题色定制 常见问题处理 详细说明

优秀的个人博客,低调大师

在iPhone的UI设计背后,是一场关于注意力的战争

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 iPhone 诞生之后,世界发生的变化是翻天覆地的。以电容触摸屏为交互中心的智能手机以难以想象的速度,成为了人类生活中不可分割的部分,人与人之间的连接因此而更加紧密,同时也更加疏远。从某种意义上来说,iPhone 的创造是开创性的,也是不可替代的。而我们也不约而同地发现,以iPhone 为标竿而创造的智能手机和数字化的交互界面,让我们处于一个时刻都会被分心的境地。 令人上瘾的数字内容,让我们一刻都离不开智能手机,从某种意义上,它彻底改变了我们的生活,工作,甚至思考的方式。现如今,越来越多的人开始尝试戒除令人上瘾的智能手机,寻找更加健康自由的人机关系。根据今天的调研,过度使用智能手机,确实会有一定机率带来心理健康的问题。从 iPhone 诞生之初,直到10年后的现在,在数字产品上瘾和用户注意力的控制这件事情上,开发团队本身就没有放松过。这次,Fast Company 专访了前苹果设计师 Imran Chaudhri。 Imran Chaudhri 早在 1995 年就加入了苹果公司,并且很快就出任了公司的人机交互界面组的设计总监,在2006年前后,他也是作为 iPhone 项目核心的6人团的一员,加入到项目当中来。 待在苹果的20多年时间里,他参与了 iPod、iPad、 Apple Watch、Apple TV 以及 iPhone 等几乎全部主要产品的用户界面的设计,直到他开始追求创造属于自己的公司和事业,才正式从苹果离职。也正是因为这样的契机,才使得 Fast Company 有机会能和他面对面地一起聊一聊他的过去,以及他留给苹果的那些遗产。 和许多设计师一样,他们对于产品的想法和企业的定位或多或少有一些错位。和苹果产品相关的很多信息,他现在依然还不能透露,但是他依然提到了很重要的事情:即使是在iPhone的原型设计阶段,他就已经意识到了,这款产品***的缺陷之一,就是它注定会分散甚至垄断用户的注意力。而与此同时,苹果也有意识的没有给予用户,对于iPhone 完全的控制权。下面,是访谈中能够对外公布的几个重要的内容摘录: 设计「请勿打扰」的功能 「我认为,从某种意义上来说,真正洞悉设计的设计师,大都能够预见到手机对于注意力的影响。在使用手机的时候,我们总会碰到被各种各样的信息和通知打扰到。」 「早些时候,当我刚刚开始制作 iPhone 的原型之时,管束还不是那么多,我们当中有几个人还有幸把原型机带回家,这样就可以每天工作生活都使用它。那个时候我全世界各地的朋友都和我保持着联系,iPhone 几乎隔一会儿就会亮一下,显示有新消息,叮叮咚咚响个不停,于是我意识到,和我们朝夕相处的手机需要一个管控功能。所以,在很早的阶段,我就开始设计请勿打扰这个功能了。」 对于谁来掌控手机设备这个事,苹果的内部产生了分歧 「其实,在苹果公司内部,想要大家都理解分心是一个影响用户生活的问题,还挺难的。乔布斯倒是很能理解的,但是公司内其他的同事,对于用户对于手机的控制权多少,其实大家还存在不少争议。我和一部分同事倡议给用户更多的掌控权,不过这个事情对产品的营销和市场运作是有影响的。所以,当时内部也有声音说,如果真的给用户太多的控制权,那么这款手机就不酷了。」 「其实直到今天,iPhone 当中绝大多数的功能都是可控的,但是其中很多功能隐藏的比较深,彻底的掌控它们是比较困难的,如果你真得想让那些整天都在轰炸你的信息彻底远离,你需要花费很长的时间来摸索,用独特的方式逐个调整或者关闭才行。因此,对于那些熟练使用iPhone 的重度用户而言,确实是可以如臂使指地掌控这台设备,但是对于更换壁纸都不太会的用户,想要搞清楚iPhone ,让它如意随心,真的是难如登天。他们没有这样的控制能力。」 关于 iPhone 是否有可能更智能地预测通知 「你可能会在一个下午安装十几个不同的新应用,然后你不停地会收到提醒和通知,是否要授权使用相机,是否要授权获取你的位置,是否允许它给你发送通知,每个都要做决定。稍后,你可能会发现,Facebook 一直在后台给你推送信息。再之后你就会发现你有睡眠障碍了,总会有信息大半夜地推送到你的眼前,让你无法安生地休息。实际上,借助请勿打扰的功能,你可以一早上再查看它们。这套系统足够智能,能够判断出哪些应用之前就已经获得了许可,哪些仍然在后台获取数据,哪些通知实际上你并不关心。所以,这套系统其实是会选择更加恰当的时机和正确的方式来建立用户和手机之间的对话和关系,手机会询问用户,你真的需要这些通知吗?或者是,你真的需要Facebook 使用你的电话簿的信息吗(因为你已经很久没有登录了)?等等。正确地设计了这套系统之后,提醒用户的方式也非常的多。」 为什么苹果***还是开始关注分心这个事情? 「iOS 12 中内置的这套防干扰的控制系统可以更加系统地监控手机各方面的功能和用量,它实际上是从iOS 6 时代的请勿打扰的功能拓展而来的。但是它在现在被推出来真正的原因是有太多的用户为此而抱怨,而媒体和用户都发文吐槽,在呼声和压力之下,它们最终在iOS 12 中呈现了出来。这个局面之下,苹果没有选择的余地,必须对于舆论有回应。这对于每个人都是好事,因为用户和他们的孩子都因此能够获得更好的产品。但是这是否是***的产品?当然算不上,因为现在的iOS系统是为了应对舆论和负面新闻而设计的,设计的意图并不对。如果是苹果主动作出这样的决策,才算得上是好产品。」 「对于苹果这种体量的大公司而言,产品设计其实复杂性非常的高。真的是这样。作为设计师,你需要服务于你的用户,你还得和公司的利益保持一致,同时,还需要对得起自己的底线和道德。服务于一个大型的企业,确实非常的难做抉择。对于用户而言,可以很轻松的直接怼苹果,说它没有做对的事情。但是身为其中的设计师,要平衡各方面的需求也压力,经常会进退维谷。有些用户因为iPhone 的一些功能,受到了负面的影响,有些人受到的影响比另一部分人更多。但是身为设计师,一个受到各方面制衡的设计师,即使是作出了改变,在很多时候也远远不够。至少在我看来,现在的改变还不够大。」 管理数字化的生活,就像管理健康一样重要 「我和数字设备之间的关系非常简单。我不希望被它所控制。从使用 iPhone 的***天起,我就用着黑色的壁纸。我不会将一大堆的东西塞进手机,减少被分心的可能性。我的手机***屏上的应用程序非常少。」 「我的意思并不是说这样做很重要,或者说我推荐这么做,对于人和手机之间的关系,每个人都不一样,处理方式也都很个人。对于如何处理自己和手机之间的关系,有人让我提一些建议,我觉得没有必要,因为我的办法并不适合所有人。一天喝多少咖啡,抽几包烟,每个人的情况都不一样,没法一概而论。不过,心理健康是一件大事,你和你的智能设备之间,应该保持着平等的关系。这至少是一个大的设计趋势,是设计师需要关注的焦点。就像可持续性发展已经成为时代的主流诉求一样,你无法忽视认知压力的存在,认知设计也势在必行。」 界面设计的未来,以及不可避免的问题 「我观察到,界面设计在很自然地进化和发展着,从按钮到旋钮,从点击到手势操作,从语音交互到情感化设计,均是如此。无论是考虑到用户的情感诉求,还是进入语音交互的领域,都一定会遭遇一大堆的问题。按钮和旋钮的设计是需要考虑到人体工程学的问题,点击和手势的交互则牵涉到更具体的压感和硬件上问题。任何人和机器之间的交互,都一定都会遭遇不自然的状况和问题,就这么简单。身为设计师,需要足够的预见性,才能真正领先于用户,预测到可能会遭遇的问题。」

优秀的个人博客,低调大师

Java+Netty、Vue+Element-UI实现的即时通信应用 leo-im

之前工作接触了几个开源的IM产品,再加上曾经用Netty实现过几个服务,于是就有了用Netty实现一个IM的想法,于是用业余时间写了一个IM,和喜欢Netty的程序员们分享。 考虑到方便扩展,在服务端采用了Http+Socket结合的设计,客户端所有的请求都基于Http,如发送消息、修改个人信息等,所有的消息推送采用Socket方式即时推送到客户端,这样的设计可以在并发访问量大的情况下,将Http服务与Socket服务分开部署,减小各自的访问压力。 Http服务也基于Netty实现,在Netty之上做了扩展,参考Spring MVC注解实现了netty-rest-server(netty-rest-server),使用该框架,可实现注解注入REST controller,实现统一异常处理控制器和拦截器(如跨域拦截器、身份验证拦截器等)。 Http服务和Scoket服务之间的解耦和通讯可使用Java内置的队列或Redis发布/订阅实现,消息处理器接收到任务后,会将该任务交由线程池处理,处理后通过GroupChannel发送广播或发给指定的Channel。 在线体验与源码地址: 服务端 Web端

优秀的个人博客,低调大师

【Android UI设计与开发】2.引导界面(二)使用ViewPager实现欢迎引导页面

1.实现的效果 2.编码前的准备工作 ViewPager是Android3.0之后提供的新特性,所以要想让你的应用向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包。没有的百度下就有了。 3.具体的编码实现 (1)布局界面比较简单,加入ViewPager组件,以及底部的引导小点 activity_main.xml (2)其中小点的图片用一个selector来控制颜色 point.xml (3)重写ViewPager适配器 ViewPagerAdapter.class (4)编辑主程序入口类 MainActivity.class 本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/4283294.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Golang 基于chrome浏览器语音识别web演示系统WebHTK开发之 UI篇

没啥好说的,直接上现阶段的HTML代码,后续修改,再更新该篇博客。 record.html: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 <!DOCTYPE html> <html> <head> <meta charset= "utf-8" /> <meta http-equiv= "X-UA-Compatible" content= "IE=edge" /> <meta name= "viewport" content= "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <meta name= "keywords" content= "PONPON,HTK,Go语言" /> <meta name= "description" content= "基于Beego开发语音识别演示系统" /> <meta name= "generator" content= "PONPON" /> <link href= "/static/css/bootstrap.min.css" rel= "stylesheet" > <link href= "/static/css/docs.css" rel= "stylesheet" > <link href= "http://cdn.bootcss.com/highlight.js/7.3/styles/github.min.css" rel= "stylesheet" > <link rel= "shortcut icon" href= "/static/img/Logoicon.jpg" > <link rel= "stylesheet" href= "http://libs.baidu.com/fontawesome/4.0.3/css/font-awesome.min.css" /> <link rel= "alternate" type= "application/rss+xml" href= "/rss.xml" /> <script type= "text/javascript" src= "/static/lib/recorder.js" > </script> <script type= "text/javascript" src= "/static/lib/jquery-1.10.1.min.js" > </script> <script type= "text/javascript" src= "/static/lib/recController.js" > </script> <title>WebHTK 演示系统</title> </head> <body> <nav id= "header" > <div class= "container960 text-center" > <h3 id= "header-h" class= "center" >闽南语 - 语音识别演示系统</h3> <ul id= "resultbox" class= "center" style= "padding-top:425px;font-size:20px;text-align: center;color:#FFC8B6;font-family:'微软雅黑'" > <li >识别结果</li> </ul> <form style= "padding-top:20px;" > <a id= "img" href= "javascript://" > <img src= "/static/img/aa.png" style= "width:85px;height:85px;" alt= "" /> </a> </form> <div id= "message" style= "padding-top:10px;font-size:16px;color:#F5FFFA;text-align: center;font-family:'微软雅黑'" >点击麦克风,开始录音!</div> <script type= "text/javascript" > var recording = false ; function test() { if (!recording) { document.getElementById( "img" ).innerHTML= "<img src='/static/img/a1.png' style='width:85px;height:85px;'' alt=''/>" ; toRecord(); recording= true ; } else { document.getElementById( "img" ).innerHTML= "<img src='/static/img/aa.png' style='width:85px;height:85px;'' alt=''/>" ; toSend(); recording = false ; } }; function toRecord(){ rec.record(); var dd = ws.send( "start" ); $( "#message" ).text( "再次点击,结束录音!" ); intervalKey = setInterval( function () { rec.exportWAV( function (blob) { rec.clear(); ws.send(blob); }); }, 300); } function toSend(){ rec.stop(); if (intervalKey == null ) { $( "#message" ).text( "请先录音再发送!" ); return }; ws.send(sampleRate); ws.send(channels); ws.send( "stop" ); rec.clear(); clearInterval(intervalKey); intervalKey = null ; } </script> </div> </nav> <audio class= "hide" controls autoplay></audio> </body> </html> recorder.js: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 ( function (window) { var WORKER_PATH = '/static/lib/recorderWorker.js' ; var Recorder = function (source, chan, cfg) { var config = cfg || {}; var channels = chan || 1; var bufferLen = config.bufferLen || 8192; this .context = source.context; this .node = this .context.createJavaScriptNode(bufferLen, channels, channels); var worker = new Worker(config.workerPath || WORKER_PATH); worker.postMessage({ command: 'init' , config: { sampleRate: this .context.sampleRate } }); var recording = false , currCallback; this .node.onaudioprocess = function (e) { if (!recording) return ; worker.postMessage({ command: 'record' , buffer: [ e.inputBuffer.getChannelData(0) ] }); } this .configure = function (cfg) { for ( var prop in cfg) { if (cfg.hasOwnProperty(prop)) { config[prop] = cfg[prop]; } } } this .record = function () { recording = true ; } this .stop = function () { recording = false ; } this .clear = function () { worker.postMessage({ command: 'clear' }); } this .getBuffer = function (cb) { currCallback = cb || config.callback; worker.postMessage({ command: 'getBuffer' }) } this .exportWAV = function (cb, type) { currCallback = cb || config.callback; type = type || config.type || 'audio/wav' ; if (!currCallback) throw new Error( 'Callback not set' ); worker.postMessage({ command: 'exportWAV' , type: type }); } worker.onmessage = function (e) { var blob = e.data; currCallback(blob); } source.connect( this .node); this .node.connect( this .context.destination); }; window.Recorder = Recorder; })(window); recorderWorker.js: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 var recLength = 0, recBuffersL = [], sampleRate; this .onmessage = function (e) { switch (e.data.command) { case 'init' : init(e.data.config); break ; case 'record' : record(e.data.buffer); break ; case 'exportWAV' : exportWAV(e.data.type); break ; case 'getBuffer' : getBuffer(); break ; case 'clear' : clear(); break ; } }; function init(config) { sampleRate = config.sampleRate; } function record(inputBuffer) { recBuffersL.push(inputBuffer[0]); recLength += inputBuffer[0].length; } function exportWAV(type) { var bufferL = mergeBuffers(recBuffersL, recLength); var interleaved = interleave(bufferL); var dataview = encodeWAV(interleaved); var audioBlob = new Blob([dataview], { type: type }); this .postMessage(audioBlob); } function getBuffer() { var buffers = []; buffers.push(mergeBuffers(recBuffersL, recLength)); this .postMessage(buffers); } function clear(inputBuffer) { recLength = 0; recBuffersL = []; } function mergeBuffers(recBuffers, recLength) { var result = new Float32Array(recLength); var offset = 0; for ( var i = 0; i < recBuffers.length; i++) { result.set(recBuffers[i], offset); offset += recBuffers[i].length; } return result; } function interleave(inputL) { var length; var result; var index = 0, inputIndex = 0; if (sampleRate == 48000) { length = inputL.length / 6; result = new Float32Array(length); while (index < length) { result[index++] = (inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++]) / 6; } } else if (sampleRate == 44100) { length = inputL.length / 6; result = new Float32Array(length); while (index < length) { if (inputIndex % 12 == 0) { result[index++] = (inputL[inputIndex] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++]) / 7; } else { result[index++] = (inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++] + inputL[inputIndex++]) / 6; }; } } else { length = inputL.length; result = new Float32Array(length); while (index < length) { result[index++] = inputL[inputIndex++]; } }; return result; } function floatTo16BitPCM(output, offset, input) { for ( var i = 0; i < input.length; i++, offset += 2) { var s = Math.max(-1, Math.min(1, input[i])); output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true ); } } function writeString(view, offset, string) { for ( var i = 0; i < string.length; i++) { view.setUint8(offset + i, string.charCodeAt(i)); } } function encodeWAV(samples) { var buffer = new ArrayBuffer(samples.length * 2); var view = new DataView(buffer); floatTo16BitPCM(view, 0, samples); return view; } recController.js: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 var onFail = function (e) { console.log( 'Rejected!' , e); }; var onSuccess = function (s) { var context = new webkitAudioContext(); var mediaStreamSource = context.createMediaStreamSource(s); rec = new Recorder(mediaStreamSource, channels); sampleRate = 8000; } navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; var rec; var intervalKey = null ; var audio = document.querySelector( '#audio' ); var sampleRate; var channels = 1; function startRecording() { if (navigator.getUserMedia) { navigator.getUserMedia({ audio: true }, onSuccess, onFail); } else { console.log( 'navigator.getUserMedia not present' ); } } startRecording(); //-------------------- var ws = new WebSocket( 'ws://' + window.location.host + '/join' ); ws.onopen = function () { console.log( "Openened connection to websocket" ); }; ws.onclose = function () { console.log( "Close connection to websocket" ); } ws.onerror = function () { console.log( "Cannot connection to websocket" ); } ws.onmessage = function (result) { var data = JSON.parse(result.data); console.log( '识别结果:' + data.Pinyin); var result = document.getElementById( "resultbox" ) result.getElementsByTagName( "li" )[0].innerHTML = data.Hanzi; document.getElementById( "message" ).innerHTML = "点击麦克风,开始录音!" ; } 进入页面: 正在录音: 识别结果,目前还为将拼音转换为汉字,下图为“点亮星光”的显示结果图: 本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1367846,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android UI开发第一篇——android的九宫格式实现

今天在devdiv论坛里看到有坛友问到九宫格的实现,我把我在项目中用的经验分享一下,九宫格用gridview实现代码如下:代码下载地址:http://www.devdiv.com/thread-39455-1-1.html xml代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.google.android.gx5weather" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:background="@drawable/bg" > <ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:background="@drawable/top"></ImageView> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numColumns="3" android:verticalSpacing="30dip" android:horizontalSpacing="10dip" android:columnWidth="90dip" //列宽 android:stretchMode="columnWidth" android:gravity="center" android:listSelector="@drawable/grid_selector_background" > </GridView> </LinearLayout> android:numColumns="3" //九宫格的列数 auto_fit时为自动 android:listSelector="@drawable/grid_selector_background" //九宫格的背景,可以找个圆角正方形 public class NineBox extends Activity { /** Called when the activity is first created. */ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main_activity); GridView gridview=(GridView)findViewById(R.id.gridview); ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>(); for(int i=1;i<10;i++) { HashMap<String, Object> map = new HashMap<String, Object>(); if(i==1){ map.put("ItemImage", R.drawable.g11); map.put("ItemText", getResources().getString(R.string.gridview1)); } if(i==2){ map.put("ItemImage", R.drawable.g12); map.put("ItemText", getResources().getString(R.string.gridview2)); } if(i==3){ map.put("ItemImage", R.drawable.g13); map.put("ItemText", getResources().getString(R.string.gridview3)); } if(i==4){ map.put("ItemImage", R.drawable.g14); map.put("ItemText", getResources().getString(R.string.gridview4)); } if(i==5){ map.put("ItemImage", R.drawable.g15); map.put("ItemText", getResources().getString(R.string.gridview5)); } if(i==6){ map.put("ItemImage", R.drawable.g16); map.put("ItemText", getResources().getString(R.string.gridview6)); } if(i==7){ map.put("ItemImage", R.drawable.g17); map.put("ItemText", getResources().getString(R.string.gridview7)); } if(i==8){ map.put("ItemImage", R.drawable.g18); map.put("ItemText", getResources().getString(R.string.gridview8)); } if(i==9){ map.put("ItemImage", R.drawable.g19); map.put("ItemText", getResources().getString(R.string.gridview9)); } lstImageItem.add(map); } SimpleAdapter saImageItems = new SimpleAdapter(this, lstImageItem, R.layout.grid_item, new String[] {"ItemImage","ItemText"}, new int[] {R.id.ItemImage,R.id.ItemText}); gridview.setAdapter(saImageItems); gridview.setOnItemClickListener(new ItemClickListener()); } class ItemClickListener implements OnItemClickListener { @SuppressWarnings("unchecked") public void onItemClick(AdapterView<?> arg0,//The AdapterView where the click happened View arg1,//The view within the AdapterView that was clicked int arg2,//The position of the view in the adapter long arg3//The row id of the item that was clicked ) { HashMap<String, Object> item=(HashMap<String, Object>) arg0.getItemAtPosition(arg2); if(item.get("ItemText").equals(getResources().getString(R.string.gridview1))){ Toast.makeText(NineBox.this, R.string.gridview1, Toast.LENGTH_LONG).show(); } if(item.get("ItemText").equals(getResources().getString(R.string.gridview2))){ Toast.makeText(NineBox.this, R.string.gridview2, Toast.LENGTH_LONG).show(); } if(item.get("ItemText").equals(getResources().getString(R.string.gridview3))){ Toast.makeText(NineBox.this, R.string.gridview3, Toast.LENGTH_LONG).show(); } if(item.get("ItemText").equals(getResources().getString(R.string.gridview4))){ Toast.makeText(NineBox.this, R.string.gridview4, Toast.LENGTH_LONG).show(); } if(item.get("ItemText").equals(getResources().getString(R.string.gridview5))){ Toast.makeText(NineBox.this, R.string.gridview5, Toast.LENGTH_LONG).show(); } if(item.get("ItemText").equals(getResources().getString(R.string.gridview6))){ Toast.makeText(NineBox.this, R.string.gridview6, Toast.LENGTH_LONG).show(); } if(item.get("ItemText").equals(getResources().getString(R.string.gridview7))){ Toast.makeText(NineBox.this, R.string.gridview7, Toast.LENGTH_LONG).show(); } if(item.get("ItemText").equals(getResources().getString(R.string.gridview8))){ Toast.makeText(NineBox.this, R.string.gridview8, Toast.LENGTH_LONG).show(); } if(item.get("ItemText").equals(getResources().getString(R.string.gridview9))){ Toast.makeText(NineBox.this, R.string.gridview9, Toast.LENGTH_LONG).show(); } } } } 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/817400,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android UI开发第二十一篇——下拉刷新列表实现(pull to refresh)

android中提供了ListView控件,listview能够为我们展现丰富的内容,有时候我们为了提升用户体检,需要更炫而且更好用户体验的效果,pull to refresh(下拉刷新列表效果)就应运而生了。 pull to refresh更多的应用于获取最新的内容,比如新浪微博、腾讯微博等。目前网上有很多开源的pull to refresh的开源实现,这里也是参考开源代码实现的。 Layout <!-- The PullToRefreshListView replaces a standard ListView widget. --> <com.markupartist.android.widget.PullToRefreshListView android:id="@+id/android:list" android:layout_height="fill_parent" android:layout_width="fill_parent" /> Activity // Set a listener to be invoked when the list should be refreshed. ((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { // Do work to refresh the list here. new GetDataTask().execute(); } }); private class GetDataTask extends AsyncTask<Void, Void, String[]> { ... @Override protected void onPostExecute(String[] result) { mListItems.addFirst("Added after refresh..."); // Call onRefreshComplete when the list has been refreshed. ((PullToRefreshListView) getListView()).onRefreshComplete(); super.onPostExecute(result); } } 源码下载:http://download.csdn.net/detail/xyz_lmn/4676611 参考: https://github.com/johannilsson/android-pulltorefresh https://github.com/fanfoudroid/fanfoudroid http://www.eoeandroid.com/thread-190295-1-1.html http://k-beta.com/android-listview-more-refresh.html 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230769,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册