中央能将互联网变成国营企业并中国禁止私人拥有黄金网站和私人游戏,私人软件app开发吗?

&>&&>&&>&&>&自定义图片上传控件
自定义图片上传控件
上传大小:80KB
自定义图片上传空间,免去了重复写代码
综合评分:4.3(3位用户评分)
所需积分:0
下载次数:108
审核通过送C币
创建者:amixuse
创建者:otldan
创建者:huang3513
课程推荐相关知识库
上传者其他资源上传者专辑
移动开发热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
自定义图片上传控件
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:自定义组合控件 - 博客频道 - CSDN.NET
分类:Android开发(初学)
UI编程将作为安卓开发人员后期开发的重点,不确定因素较多,工作量大,更是一个好的编程人员能力体现。
Window/View/Activity关系
一个Activity仅仅只创建一个Window(IPolicy.makeNewWindow),即PhoneWindow
window可以通过setContentView设置一个rootView(一般是viewGroup,mDecorView),作为window显示的第一个即根view
view.add函数可以让window显示内容增多,形成“一棵树”排列结构
UI工作原理-控件绘制过程
绘画从布局的根节点开始,它被要求来测量和绘制布局树
调用每个View的draw方法
先画父节点(也就是在屏幕后面),然后按照树中出现的顺序画其同层次节点
度量过程在measure(int,int)里实现且是一个自顶向下的视图树遍历。每个视图在递归时往下推送尺寸规格。在度量过程的最后,每个视图都已经保存了自己的度量
UNSPECIFIED:让父视图直接按照子视图需求的尺寸进行分配,比如一个LinearLayout在measure中就对子视图使用UNSPECIFIED模型,它不限制大小,按照子视图的需求进行分配
EXACTLY:强迫子视图的尺寸必须按照父视图分配的尺寸进行测量,如果子视图的实际尺寸比这个尺寸大则需要缩小,如果子视图的实际尺寸比这个尺寸小则需要扩大
AT_MOST:强迫让子视图使用最大的尺寸,子视图的尺寸不得大于父视图定义的最大尺寸,但是可以小于这个最大尺寸值(跟EXACTLY不一样的是它可以小于这个尺寸值)
发生在 layout(int, int, int, int)中并且也是自顶向下。在这个过程中,每个父节点负责定位它的所有子节点,通过使用在度量过程中计算得到的尺寸
利用多个现有的控件组合而成。
例:自定义标题栏
类似标题栏将在多处使用,因此将其封装成一个控件。
定义titlebar.xml文件
android:layout_width="match_parent"
android:layout_height="wrap_content" &
//可暂时先用Button代替
android:id="@+id/left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp" /&
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_centerVertical="true"
android:text="title"
android:textColor="#000000"
android:textSize="20sp"
android:gravity="center" /&
//可暂时先用Button代替
android:id="@+id/right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp" /&
定义封装控件类TitleBar.java
public class TitleBar extends RelativeLayout {
private Button left,
private TextV
public TitleBar(Context context) {
super(context);
public TitleBar(Context context, AttributeSet attrs) {
super(context, attrs);
private void init(){
View v = LayoutInflater.from(getContext()).inflate(R.layout.titlebar, this);
title = (TextView) v.findViewById(R.id.title);
public void setTitle(String title){
if(null!=title)
this.title.setText(title);
使用:在layout布局文件中加载封装好的类,格式:&包名+类名/&
自定义控件
外观和功能由程序员自行开发,灵活多变。
例如:iPhone的滑动按钮
排名:千里之外
(39)(4)(1)(2)(2)(3)(3)(8)(2)下次自动登录
现在的位置:
& 综合 & 正文
自定义控件一
尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究!
自定义View,很多初学Android的童鞋听到这么一句话绝逼是一脸膜拜!因为在很多初学者眼里,能够自己去画一个View绝逼是一件很屌很Cool的事!但是,同样而言,自定义View对初学者来说却往往可望而不可及,可望是因为看了很多自定义View的源码好像并不难,有些自定义View甚至不足百行,不可及呢是因为即便看了很多很多类似的源码依然写不出一个霸气的View来。这时会有很多前辈告诉你多看看View类的源码,看看View类里是如何去处理这些绘制逻辑的,如果你去看了我只能说你是个很好学很有求知欲的孩纸,了解原理是好事,但是并非凡事都要去刨根问底的!如果你做Android开发必须要把Android全部源码弄懂,我只能呵呵了!你还不如去写一个系统实在对吧!同样的道理,写一个自定义View你非要去花巨量时间研究各类源码是不值得提倡的,当然哥没有否定追究原理的意义所在,只是对于一个普通的开发者你没有必要去深究一些不该值得你关心的东西,特别是一个有良好面向对象思维的猿。举个生活中简单的例子,大家都用过吹风,吹风一般都会提供三个档位:关、冷风、热风对吧,你去买吹风人家只会告诉你这吹风三个档位分别是什么功能,我相信没有哪个傻逼买吹风的会把吹风拆开、电机写下来一个一个地跟你解说那是啥玩意吧!同样的,我们自定义View其实Android已经提供了大量类似吹风档位的方法,你只管在里面做你想做的事情就可,至于Android本身内部是如何实现的,你压根不用去管!用官方文档的原话来说就是:Just
do you things!初学者不懂如何去自定义View并非是不懂其原理,而是不懂这些类似“档位”的方法!
好了,扯了这么多废话!我们还是先步入正题,来看看究竟自定义View是如何实现的!在Android中自定义一个View类并定是直接继承View类或者View类的子类比如TextView、Button等等,这里呢我们也依葫芦画瓢直接继承View自定义一个View的子类CustomView:
在View类中没有提供无参的构造方法,这时我们的IDE会提示我们你得明确地声明一个和带有父类一样签名列表的构造方法:
这时我们点击“Add constructor CustomView(Context context)”,IDE就会自动为我们生成一个带有Context类型签名的构造方法:
Context是什么你不用管,只管记住它包含了许多各种不同的信息穿梭于Android中各类组件、控件等等之间,说得不恰当点就是一个装满信息的信使,Android需要它从里面获取需要的信息。
这样我们就定义了一个属于自己的自定义View,我们尝试将它添加到Activity:
运行后发现什么也没有,空的!因为我们的CustomView本来就什么都没有!但是添加到我们的界面后没有什么问题对吧!Perfect!那我们再直接在xml文档中引用它呢:
这时我们还原Activity中的代码:
再次运行后发现IDE报错了:
大致意思是无法解析我们的CustomView类找不到方法,为什么呢?我们在xml文件引用我们的CustomView类时为其指定了两个android自带的两个属性:layout_width和layout_height,当我们需要使用类似的属性(比如更多的什么id啊、padding啊、margin啊之类)时必须在自定义View的构造方法中添加一个AttributeSet类型的签名来解析这些属性:
再次运行发现一切又恢复了正常。现在我们来往我们的View里画点东西,毕竟自定义View总得有点什么才行对吧!Android给我们提供了一个onDraw(Canvas canvas)方法来让我们绘制自己想要的东西:
我们想要画些什么直接在这个方法里面画即可,在现实世界中,我们画画需要两样东西:笔(或者任何能涂画的东西)和纸(或者任何能被画的东西),同样地,Android也给我们提供了这两样东西:Paint和Canvas,一个是画笔而另一个呢当然是画布啦~~,我们可以看到在onDraw方法中,画布Canvas作为签名被传递进来,也就是说这个画布是Android为我们准备好的,不需要你去管,当然你也可以自定义一张画布在上面绘制自己的东西并将其传递给父类,但是一般我们不建议这样去做!有人会问这画布是怎么来的?在这里我不想跟大家深究其原理,否则长篇大论也过于繁琐打击各位菜鸟哥的学习兴趣。但是我可以这样跟大家说,如果在一张大的画布(界面)上面有各种各样小的画布(界面中的各种控件),那么这些小的画布该如何确定其大小呢?自己去想哈哈!草!又跑题了!
画布有了,差一支画笔,简单!我们new一个呗!猿的好处就在万事万物都可以自己new!女朋友也能自己new,随便new!!~~~:
实例化了一个Paint对象后我们为其设置了抗锯齿(一种让图像边缘显得更圆滑光泽动感的碉堡):setAntiAlias(true),但是我们发现这是IDE又警告了!!!说什么“Avoid object allocations during draw/layout operations (preallocate and reuse instead)”:
Why?Why?说白了就是不建议你在draw或者layout的过程中去实例化对象!为啥?因为draw或layout的过程有可能是一个频繁重复执行的过程,我们知道new是需要分配内存空间的,如果在一个频繁重复的过程中去大量地new对象内存爆不爆我不知道,但是浪费内存那是肯定的!所以Android不建议我们在这两个过程中去实例化对象。既然都这样说了我们就改改呗:
现实世界中,我们画画的画笔是多种多样的,有马克笔、铅笔、圆珠笔、毛笔、水彩笔、荧光笔等等等等……而这些笔的属性也各自不同,像铅笔按照炭颗粒的粗糙度可以分为2B、3B、4B、5B、HB当然还有SB,而水彩笔也有各种不同的颜色,马克笔就更霸气了不说了!同样地在Android的画笔里,现实有的它也有,没有的它还有!我们可以用Paint的各种setter方法来设置各种不同的属性,比如setColor()设置画笔颜色,setStrokeWidth()设置描边线条,setStyle()设置画笔的样式:
Paint集成了所有“画”的属性,而Canvas则定义了所有要画的东西,我们可以通过Canvas下的各类drawXXX方法绘制各种不同的东西,比如绘制一个圆drawCircle(),绘制一个圆弧drawArc(),绘制一张位图drawBitmap()等等等:
既然初步了解了Paint和Canvas,我们不妨就尝试在我们的画布上绘制一点东西,比如一个圆环?我们先来设置好画笔的属性:
然后在我们的onDraw方法中绘制Cricle即可:
这里要注意哦!drawCircle表示绘制的是圆形,但是在我们的画笔样式设置为描边后其绘制出来的就是一个圆环!其中drawCircle的前两个参数表示圆心的XY坐标,这里我们用到了一个工具类获取屏幕尺寸以便将其圆心设置在屏幕中心位置,第三个参数是圆的半径,第四个参数则为我们的画笔!
这里有一点要注意:在Android中设置数字类型的参数时如果没有特别的说明,参数的单位一般都为px像素。
好了,我们来运行下我们的Demo看看结果:
一个灰常漂亮的圆环展现在我们眼前!怎么样是不是很爽,这算是我们写的第一个View,当然这只是第一步,虽然只是一小步,但必定会是影响人类进步的一大步!……Fuck!
不过一个简单地画一个圆恐怕难以满足各位的胃口对吧,那我们尝试让它动起来?比如让它的半径从小到大地不断变化,那怎么实现好呢?大家如果了解动画的原理就会知道,一个动画是由无数张连贯的图片构成的,这些图片之间快速地切换再加上我们眼睛的视觉暂留给我们造成了在“动”的假象。那么原理有了实现就很简单了,我们不断地改变圆环的半径并且重新去画并展示不就成了?同样地,在Android中提供了一个叫invalidate()的方法来让我们重绘我们的View。现在我们重新构造一下我们的代码,添加一个int型的成员变量作为半径值的引用,再提供一个setter方法对外设置半径值,并在设置了该值后调用invalidate()方法重绘View:
那么OK,我们在Activity中开一个线程,通过Handler来定时间断地设置半径的值并刷新界面:
运行后的效果我就不演示了,项目源码会共享。
但是有一个问题,这么一个类似进度条的效果我还要在Activity中处理一些逻辑多不科学!浪费代码啊!还要Handler来传递信息,Fuck!就不能在自定义View中一次性搞定吗?答案是肯定的,我们修改下CustomView的代码让其实现Runnable接口,这样就爽多了:
而我们的Activity呢也能摆脱繁琐的代码逻辑:
运行一下看看呗!肏!!!报错了:
Why!因为我们在非UI线程中更新了UI!而在Android中非UI线程是不能直接更新UI的,怎么办?用Handler?NO!Android给我们提供了一个更便捷的方法:postInvalidate();用它替代我们原来的invalidate()即可:
运行效果不变。
温馨提示:自定义控件其实很简单系列文章每周一、周四更新一篇~
下集精彩预告:Paint为我们提供了大量的setter方法去设置画笔的属性,而Canvas呢也提供了大量的drawXXX方法去告诉我们能画些什么,那么小伙伴们知道这些方法是怎么用的又能带给我们怎样炫酷的效果呢?
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 互联网私人订制农场 的文章

 

随机推荐