html提示框插件
最近工作需要,用到各式各样的提示框,寻找了很久,发现一个的第三方的插件很好用,各种样式、接口良好、允许自定义。
使用需要先引入jq1.8以上:
1 | <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> |
最近工作需要,用到各式各样的提示框,寻找了很久,发现一个的第三方的插件很好用,各种样式、接口良好、允许自定义。
使用需要先引入jq1.8以上:
1 | <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> |
在实际应用中,我们可能会遇到把ListView放到ScrollView中的情况,在这种情况下,ListView的滑动属性与ScrollView的滑动出现冲突,从而ListView只显示一项。这里提供一种解决方案,就是设置ListView中每个Item的高度显示之,使他失去滑动的属性,从而适应ScrollView的滑动。只需在填充数据之后设置即可:
1 | /** |
今天来介绍图片加载的框架Android-Universal-Image-Loader
GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader
也可以自行百度下载。
首先来封装的一个类CacheTool ,由于其他加载图片的方法有点繁琐,所以这里仅封装了一个简单实用的加载方法:
1 | import android.content.Context; |
封装好了,里面都有详细的介绍,这里介绍下上面的中的ImageLoadingListener 接口回调,按ctrl + 鼠标左键可以进入jar包里的java文件:
1 | /******************************************************************************* |
从以上代码中我们可以了解到接口中我们可以监听到开始、失败、完成、取消的动作。
现在开始使用吧:
1 | private ImageView My_Head; |
Mark一下,暂存一个直接通过URL获取bitmap的函数,未作内存处理。
1 | /** |
本篇来介绍移动应用图片存储的第三方,官方网址:http://www.qiniu.com/
首先,在七牛上要注册开发者账号,需要认证身份证信息。认证完之后,我们来开始进行安卓端的开发。
一、准备信息
进行图片的上传与下载,我们需要准备几个信息,首先是空间名,然后是域名,再者是密钥对。如下图:
二、安卓端图片上传
首先我们需要导入JAR包,网址:http://developer.qiniu.com/docs/v6/sdk/android-sdk.html
现在来编写上传相关的程序:
1 | private volatile boolean isCancelled = false;// 取消标志 static String AccessKey =七牛上的公钥; |
初始化配置搞定了,下面来进行上传操作:
1 | String _uploadToken = getUploadToken(scope); uploadManager.put(SAVE_FILE_DIRECTORY, // 本地上传路径、文件、字符串 |
在上传的操作中唯一需要我们头疼的就是_uploadToken,下面来介绍如何生成一个_uploadToken令牌信息:
1 | public String getUploadToken(String scope) { |
好了现在我们就可以成功上传了。
三、编写其他操作
1、取消操作
1 | /** |
2、删除操作
1 | /** |
好了,暂时就先到这里,虽然进行了一些封装,但是对自己的封装不很满意所以暂时不发了,以后封装完善了再发吧,这些已经足够新手理解了。下篇介绍获取网络图片并显示。主要用到目前最好的图片加载框架ImageLoad。
原帖地址:http://my.oschina.net/wangjunhe/blog/99764
创建新的控件:
作为一个有创意的开发者,你经常会遇到安卓原生控件无法满足你的需求。
为了优化你的界面和工作流程,安卓允许你去继承已经存在的控件或者实现你自己的控件。
那么最好的方式去创建一个新的控件是什么? 这主要取决你想要完成什么。
1.有些基本功能原生控件都能提供,所以这个时候你只需要继承并对控件进行扩展。通过重写它的事件,onDraw,但是始终都保持都父类方法的调用。
2.组合控件 就是通过合并几个控件的功能来生成一个控件。
3.完完整整创建一个新的控件。
1.修改存在的控件
例子:
1 | public class MyTextView extends TextView { |
2.组合控件
1.最简单的方式,是定义了XML布局文件,然后用include实现重用。(。。。这也算啊。。。)
2.去合并一个控件 通常你自定义的控件需要继承一个ViewGroup(通常就是Layout),就像:
1 | public class MyCompoundView extends LinearLayout { |
就像activity,比较好的设计一个混合的控件UI布局是使用一个外部的layout资源。
这里我们模拟定义一个:
1 | <?xml version=”1.0” encoding=”utf-8”?> |
** 然后在构造函数初始化的时候:**
1 | public class ClearableEditText extends LinearLayout { |
使用:在activity_main.xml
通常是继承View或者SurfaceView ,View类提供一个Canvas(画布)和一系列的画的方法,还有Paint(画笔)。使用它们去创建一个自定义的UI。你可以重写事件,包括屏幕接触或者按键按下等等,用来提供与用户交互。
1.如果你不需要快速重画和3D图像的效果,那么让View作为父类提供一个轻量级的解决方案。
2.如若不然,就需要使用SurfaceView作为父类,这样你就可以提供一个后台线程去画和使用OPENGL去实现你的图像。这个就相对重量级了,如果你的视图需要经常更新,然后由需要显示比较复杂的图像信息(尤其是在游戏和3D可视化),SurfaceView将是更好的选择。
在这里我们讨论前者,后者后期再讨论。
一般你需要重写2个方法:
1.onMeasure
什么是onMeasure?
下面转载一段文章:
View在屏幕上显示出来要先经过measure(计算)和layout(布局).
1、什么时候调用onMeasure方法?
当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.
这两个参数指明控件可获得的空间以及关于这个空间描述的元数据.
更好的方法是你传递View的高度和宽度到setMeasuredDimension方法里,这样可以直接告诉父控件,需要多大地方放置子控件.
widthMeasureSpec和heightMeasureSpec这2个参数都是整形是出于效率的考虑,所以经常要做的就是对其解码=>
1 | 1. int specMode = MeasureSpec.getMode(measureSpec); |
依据specMode的值,(MeasureSpec有3种模式分别是UNSPECIFIED, EXACTLY和AT_MOST)
如果是AT_MOST,specSize 代表的是最大可获得的空间;
如果是EXACTLY,specSize 代表的是精确的尺寸;
如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
2、那么这些模式和我们平时设置的layout参数fill_parent, wrap_content有什么关系呢?
经过代码测试就知道,当我们设置width或height为fill_parent时,容器在布局时调用子 view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。
而当设置为 wrap_content时,容器传进去的是AT_MOST, 表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。当子view的大小设置为精确值时,容器传入的是EXACTLY, 而MeasureSpec的UNSPECIFIED模式表示你没有指定大小。
1 | @Override |
总结:
通过
1 | int specMode = MeasureSpec.getMode(measureSpec); |
这2个值,然后计算自己想要占有的宽和高。
2.onDraw
这个不解释了。(后期会细说canvas和paint)
各种数字类型转换成字符串型:
String s = String.valueOf(value); // 其中 value 为任意一种数字类型。
字符串型转换成各种数字类型:
1 | String s = "169"; |
java文件:MainActivity.java、Activity1.java、Activity2.java、Activity3.java、Activity4.java
MainActivity.java
1 | package com.example.tabhostmove; |
xml布局文件:activity_main.xml、activit1.xml、activit2.xml、activit3.xml、activit4.xml
activity_main.xml
1 | <TabHost xmlns:android="http://schemas.android.com/apk/res/android" |
注:activity1、2、3、4是测试的页面,随便建几个即可,别忘了在AndroidManifest.xml里注册页面的活动
实现效果:
主要的用到的控件:HorizontalScrollView
主要的功能:把几张图片解析成一张图片,在一个容器中呈现。
布局文件xml
side_bar_scollview.xml//显示view的容器
1 | <?xml version="1.0" encoding="utf-8"?> |
home.xml//显示的主页面
1 | <?xml version="1.0" encoding="utf-8"?> |
menu.xml//显示的菜单页面
1 | <?xml version="1.0" encoding="utf-8"?> |
MainActivity.java//主活动
1 | package com.example.side_bar_scrollview; |
效果图:
1、clean之后R文件消失
clean之后R文件消失是因为布局的XML文件存在错误,无法编译你的资源文件,所以无法自动生成R文件,在Problem、LogCat等界面查看错误的原因,把错误改正即可;
此外还有可能是引用问题,查看开头的import是否错误的引用了android的组件,把他删掉,重新引用具体包的路径。
方法一:在AndroidManifest.xml中配置
如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:
“unspecified”:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
“landscape”:横屏显示(宽比高要长)
“portrait”:竖屏显示(高比宽要长)
“user”:用户当前首选的方向
“behind”:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
“sensor”:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
“nosensor”:忽略物理感应器,这样就不会随着用户旋转设备而更改了(”unspecified”设置除外)。
方法二:在java代码中设置
设置横屏代码:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
设置竖屏代码:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
因为横屏有两个方向的横法,而这个设置横屏的语句,如果不是默认的横屏方向,会把已经横屏的屏幕旋转180°。
所以可以先判断是否已经为横屏了,如果不是再旋转,不会让用户觉得转的莫名其妙啦!代码如下:
if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}