position

css sprite实例

心不动则不痛 提交于 2020-03-15 17:21:32
css sprite直译过来就是CSS精灵。通常被解释为“CSS图像拼合”或“CSS贴图定位”。本文章向码农们介绍css sprite使用方法和基本使用实例,需要的码农可以参考一下。 一、什么是css sprites css sprites 直译过来就是 CSS精灵 。通常被解释为“ CSS图像拼合 ”或“ CSS贴图定位 ”。其实就是通过将多个图片融合到一张图里面,然后通过 CSS background 背景定位技术技巧布局网页背景。这样做的好处也是显而易见的,因为图片多的话,会增加http的请求,无疑促使了网站性能的减低,特别是图片特别多的网站,如果能用 css sprites降低图片数量,带来的将是速度的提升。 css sprites是什么通俗解释: CSS Sprites 其实就是把网页中一些背景图片整合 拼合成一张图片中 ,再利用CSS的“ background-image ”,“ background- repeat ”,“ background-position ”的组合进行背景定位,background-position可以用数字能精确的定位出背景图片在布局盒子对象位置。 二、适合与不适合CSS sprites拼合布局 1、适合:一般小图标素材 小的图标ico类素材,一般图标很小十多像素几十像素的宽度高度,这种适合拼合成一张图实现sprites

Irrlicht以及我的毕业设计

故事扮演 提交于 2020-03-15 01:52:26
鬼火引擎 因为临近毕业,毕业设计报的是一个3D有关一个设计,又因为平时都是在Linux上开发工作所以选了用C++实现的一个比较轻量级引擎。鬼火引擎学习成本不大,不过因为涉及不到高级操作,至于直接写矩阵变换,shader就比较困难了。引擎大部分代码结构都比较统一,可以看到关于场景的创建绘制都在 SceneManager 中,关于显存资源的管理都在 VideoDriver 中,gui在 GuiEnviroment 中,所以想要一个功能能够立马知道该从哪洗方面入手,降低了入门门槛。但是还是存在一些明显的不足,比如默认的阴影实现不是太完美,影子可以穿过墙壁,现在还没有找到比较好的解决方法。 如果想要制作一个3d程序,很自然而言的就需要场景编辑器,将模型摆放在指定位置然后程序直接读取配置文件完成预先定义场景,有个比较老解决方案是用 irrEdit ,不过一是这个项目已经很久没有更新了,官网上最后一次更新还是在2010年,二是这个程序目前只支持win,比较无语。不过因为irrlicht这几年也没有太大的更新,所以如果实在想用可以在win下用这款工具生成一个 .irr 的场景文件然后用 SceneManager::loadScene 加载。 如果初学鬼火引擎,一个建议是要使用一个可以自动补齐的IDE,用vim搭配插件的方式也可以。能够自动补齐 irrlicht

javascript模拟flash头像裁切上传

醉酒当歌 提交于 2020-03-14 09:38:57
是的,jq已经有类似的插件了,或者干脆用flash算了,为什么我还要自己写?因为造(wo)轮(bu)子(hui)也(flash)是一个学习的过程,轮子不会造,将来怎么造飞机?先来一张最终效果图: 一、大概思路 用js来做这个效果,先得将图片A上传到服务器,关于异步上传的插件有很多,不用插件也可以参考本人 上一篇博客 用纯js的方式上传,上传之后显示到页面里,由于上传的图片尺寸各不相同,要完整地显示图片,就要将上传后的图片用css控制按比例缩放显示,然后通过矩形选框选择需要的部分,用js获取矩形选框的左上角坐标,加上选框的宽高按比例计算后传给后台,后台程序根据所传参数来裁切得到图片B后返回到前台并将上传的原图A删除,节省空间。 二、分析 将效果图分为左右两部分,先看左边,由一张图片加一个矩形选区组成,图片和选区之间有一层半透明的遮罩,但是这样的话会连选区部分一块遮住,就没有上面这种框选出来的效果了,事实上结构是这样的:由下往上分别是1图片层,2遮罩层,3选区层(一个div,绝对定位),4图片层(绝对定位)。第1层和第4层的图片是一样的,大小及left、top值也一样,给第3层选区层加个overflow:hidden,就呈现出了上面的效果,虚线边框及拖拽的8个点后文会讲到。下图比较直观地说明的它们的层级关系,第3层灰色部分为overflow:hidden隐藏的部分:

Android之ListView/GridView 优化

旧城冷巷雨未停 提交于 2020-03-13 15:04:20
一、效率最低的getView实现 我们知道,ListView和GridView的显示都是通过Adapter的getView实现的。 ListView/GridView数据量较小时,我们的处理方式一般是这样的(效率最低的一种方式) 1 public View getView(int position, View convertView, ViewGroup parent) { 2 View item = mInflater.inflate(R.layout.list_item_icon_text, null); 3 ((TextView) item.findViewById(R.id.text)).setText(DATA[position]); 4 ((ImageView) item.findViewById(R.id.icon)).setImageBitmap( 5 (position & 1) == 1 ? mIcon1 : mIcon2); 6 return item; 7 } 当数据量非常大时,这样每一次getView都会去inflate布局,效率太差,这会让我们的程序卡顿,滑动多了还会OOM。 二、利用Android已经提供了View缓存机制实现ViewHolder模式——实现View共享 我们注意到getView的第二个参数convertView

android Gallery可循环显示图片

╄→гoц情女王★ 提交于 2020-03-13 13:46:32
循环显示图像的原理 循环显示有些类似于循环链表,最后一个结点的下一个结点又是第 1 个结点。循环显示图像也可以模拟这一点。 也许细心的读者从上一节实现的 ImageAdapter 类中会发现些什么。对!就是 getView 方法中的 position 参数和 getCount 方法的关系。 position 参数的值是不可能超过 getCount 方法返回的值的,也就是说, position 参数值的范围是 0 至 getCount() - 1 。 如果这时 Gallery 组件正好显示到最后一个图像, position 参数值正好为 getCount() - 1 。那么我们如何再让 Gallery 显示下一个图像呢?也就是说让 position 参数值再增 1 ,对!将 getCount() 方法的返回值也增 1 。 那么这里还有一个问题,如果 position 参数值无限地增加,就意味着 resIds 数组要不断地增大,这样会大大消耗系统的资源。想到这,就需要解决两个问题:既要 position 不断地增加,又让 resIds 数组中保存的图像资源 ID 是有限的,该怎么做呢?对于 getCount() 方法非常好解决,可以让 getCount 方法返回一个很大的数,例如, Integer.MAX_VALUE 。这时 position 参数值就可以随着 Gallery

three.js 学习之旅(一)

北城以北 提交于 2020-03-13 12:40:21
THREE.js学习 重要的3样东西: 场景(Scene)、相机(Camera)、渲染(Renderer) 1、首先新建一个场景(Scene)(ps:这里的场景类似flash的舞台) 2、然后新建一个相机(Camera),three.js里有很多不同的相机。官方示例里用的是--透视投影相机(PerspectiveCamera)。 1 PerspectiveCamera(fov, aspect, near, far) PerspectiveCamera构造函数接受4个参数。 -- fov 可视角度 -- aspect 宽高比(width/height),通常设置为canvas元素的宽高比 -- near 近端距离 -- far 远端距离 只有离相机的距离大于near值,小于far值,且在相机的可视角度之内,才能被相机投影到。 3、场景跟相机都生成以后,还需要摆放在场景里的物体。 用BoxGeometry生成一个立方体。 1 BoxGemetry(width, height, dept, widthSegments, heightSegments, depthSegments) -- width,height,dept分别是长宽高 -- widthSegments, heightSegments, deptSegments是对应长宽高的分段,在使用线模式({wireframe:true

理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-12 22:18:40
SVG元素不像HTML元素一样由CSS盒模型管理。这使得我们可以更加灵活定位和变换这些元素-也许一眼看上去不太直观。然而,一旦你理解了SVG坐标系和变换,操纵SVG会非常简单并且很有意义。本篇文章中我们将讨论控制SVG坐标系的最重要的三个属性: viewport , viewBox , 和 preserveAspectRatio 。 这是本系列三篇文章中的第一篇,这篇文章讨论SVG中的坐标系和变换。 理解SVG坐标系和变换(第一部分)-viewport, viewBox ,和 preserveAspectRatio 理解SVG坐标系和变换(第二部分)- transform 属性 理解SVG坐标系和变换(第三部分)-建立新视窗 为了使文中的内容和解释更形象化,我创建了一个互动演示,你可以任意改变 viewBox 和 preserveAspectRatio 的值。 在线案例 这个例子只是主要内容的一小部分,所以看完请回来继续阅读这篇文章 SVG画布 canvas 是绘制SVG内容的一块空间或区域。理论上,画布在所有维度上都是无限的。所以SVG可以是任意尺寸。然而,SVG通过 有限区域 展现在屏幕上,这个区域叫做 viewport 。SVG中超出视窗边界的区域会被裁切并且隐藏。 视窗 视窗是一块SVG可见的区域。你可以把视窗当做一个窗户,透过这个窗户可以看到特定的景象,景象也许完整

C#进阶(十)

£可爱£侵袭症+ 提交于 2020-03-12 12:03:43
SUNWEN教程之----C#进阶 (十) mrfat@china.com 大家好,我是SUNWEN.今天下午得知,晚上要去当"更夫".呵呵,我们这个学校很是奇怪,要叫我们轮流去通宵巡逻,从晚上10:30到早上6:00.我有一个物理系的朋友,上次在田家炳楼门前找了一个宣传板,垫在下面就睡了一觉,听了笑死我了!哈哈! 现在我想说的是C#中的容器.这是一个非常重要的话题,因为不管你写什么样的程序,你都不能不与容器打交道.什么是容器呢(倒!).容器就是可以容纳东西的东西(再倒!),在C#和JAVA这种面向对象的编程语言中,容器就被称为可以容纳对象的东东,不是说"一切都是对象吗?"以前,我一个搞C++的程序员朋友告诉我,JAVA中的容器太好用了,比C++好用多了.而作为JAVA的后来者的C#毫无疑问,它的容器功能肯定也是很强大的. foreach语句是遍历容器的元素的最简单的方法.我们可以用System.Collections.IEnumerator类和System.Collections.IEnumerable接口来使用C#中的容器,下面有一个例子,功能是字符串分割器. 000: // CollectionClasses\tokens.cs 001: using System; 002: using System.Collections; 003: 004: public class

Android开发进阶 -- 通用适配器 CommonAdapter

感情迁移 提交于 2020-03-12 09:41:50
在Android开发中,我们经常会用到ListView 这个组件,为了将ListView 的内容展示出来,我们会去实现一个Adapter来适配,将Layout中的布局以列表的形式展现到组件中。   比如,像 GGTalk 安卓版的查找用户功能,会把符合条件的用户都列在下面: 为了达到这个效果,我们需要实现一个自定义的Adapter,而其它地方的ListView也要实现一个Adapter,这些Adapter会有很多重复的代码,非常繁琐,现在我就将重复代码封装到了一个通用的适配器CommonAdapter中,这样,在使用时只要继承CommonAdapter就可以了,如此就避免了大段代码的重复,让代码更简洁易懂。我们先来看看CommonAdapter的定义。   一.CommonAdapter 实现 public abstract class CommonAdapter<T> extends BaseAdapter { private List<T> dataList; protected Context context; protected int item_layoutId=0; protected HashMap<Integer,Integer> layoutIdMap; //多种itemView时用到。 第一个int对应type类型,第二个int对应 itemlayoutId /

增量capacity分配的ByteBuffer实现

旧时模样 提交于 2020-03-12 09:34:45
文章目录 前言 Ozone内部的增量ByteBuffer实现 引用 前言 对于Java nio ByteBuffer,我们常常会拿来做缓冲数据的处理。如果我们就为了图方便,每次数据读写操作专门allocate一个比较大capacity的ByteBuffer,这样会造成不必要的JVM heap的浪费。但是如果我们转而变为多个小ByteBuffer的动态申请,又会加大ByteBuffer的管理协调 操作。那么有什么办法能结合上述二者的特点,做到既不浪费JVM heap空间的使用,又不用在业务上执行复杂的ByteBuffer逻辑。本文笔者介绍一个Ozone内部实现的增量ByteBuffer的实现。增量ByeBuffer在外部使用上和ByteBuffe原生r操作方法语义完全兼容,内部增量allocate capacity操作对调用方而言完全透明。 Ozone内部的增量ByteBuffer实现 这里简单介绍下Ozone的背景,Ozone作为对象存储系统,在存储对象文件的时候,会涉及到大量小数据对象的写入,以Chunk文件的形式进行物理存储。在读写chunk数据的过程中,Ozone使用了ByteBuffer做中间数据的存储。在初始实现中,Ozone内部初始的ByteBuffer allocate的capacity是比较大的,也不管用户写入的数据有多大。为此