还要过程arp解析过程。

【Android实战】记要自学自定义GifView过程,详解属性那些事!【学习篇】 - Android当前位置:& &&&【Android实战】记要自学自定义GifView过程,详解属【Android实战】记要自学自定义GifView过程,详解属性那些事!【学习篇】&&网友分享于:&&浏览:0次【Android实战】记录自学自定义GifView过程,详解属性那些事!【学习篇】我现在要自定义一个ImageView,用来显示Gif图片
自定义View,是肯定需要重写构造方法的。
public class MyGifView extends ImageView {
public MyGifView(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
public MyGifView(final Context context, final AttributeSet attrs) {
super(context, attrs);
public MyGifView(final Context context) {
super(context);
虽然是自定义view,但现在等于什么都没写,等于还是原来那个ImageView。然后在main.xml中简单引入,用法和ImageView一样。
&com.azz.mygifview.MyGifView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:src = "@drawable/coffee"/&
coffee是一张gif动图,此时运行,就显示coffee的第一帧图片。
AttributeSet
构造方法参数列表里有个AttributeSet attrs属性我很在意,不明白它的具体含义,看源码之后查到了两个方法
int getAttributeCount()
String getAttributeName(int index)
通过这两个方法简单结合,我得到了答案
public MyGifView(final Context context, final AttributeSet attrs) {
super(context, attrs);
int count = attrs.getAttributeCount();
for (int i = 0; i & i++) {
Log.d(TAG, "attrs = " + attrs.getAttributeName(i));
//输出结果
attrs = layout_width
attrs = layout_height
attrs = src
发现了什么?这些值刚好是我在xml里引入时设置的初值!如果我在xml去掉src引用,打印显示的结果也会去掉。
由此可以推断,attrs代表的是已设置的属性集合。
TypedArray(1)
看网上的自定义View,第一步就是在重写的构造函数里获取TypedArray属性,如下
public MyGifView(final Context context, final AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.GifView);
就目前代码量而言,这句话会报错,因为根本没有R.styleable.GifView
首先这个方法 obtainStyledAttributes(AttributeSet set, int attrs[])的含义大概是从设置的属性里获取自定义样式属性,第一个参数,刚刚验证了是xml里设置了的属性;第二个参数是我们自己自定义的所有属性集合。而现在我们并没有自定义属性,所以直接R.styleable是“点”不出来的。
如何自定义属性
自定义属性不难,就是在工程的res/values下新建attrs.xml,然后在里面加入如下标签组定义
&resources&
&declare-styleable name = "GifView"&
&attr name = "gif_src" format = "reference"/&
&/declare-styleable&
&/resources&
可以看到这里就有关键字“styleable”的出现。
简单介绍一下,要注意的地方(自己可以自定义的地方),有三个地方。
1.declare-styleable name 代表的是自定义的属性组名
2.attr name 代表的是具体能在xml中定义的属性名
3.format 代表的是属性格式。
format的值可以有:
reference:参考某一资源ID
color:颜色值
boolean:布尔值
dimension:尺寸值。
float:浮点值。
integer:整型值。
string:字符串
fraction:百分数。
enum:枚举值
flag:位或运算
注意:属性定义格式可以指定多种类型
&attr name = "background" format = "reference|color"/&
调用时既可以用drawable资源又可以直接用颜色
android:background = “@drawable/图片ID | #00FF00”
如何在xml中加上自定义属性
在根部结点加入自己的命名空间xmlns:my = "/apk/res/com.azz.mygifview",其中“my”是自定义标签,可以修改,用my:xxxx = ""的形式来定义自己的属性;“com.azz.mygifview”是程序包名,以AndroidManifest里的package值为准。
放置位置如下:main.xml
&RelativeLayout xmlns:android="/apk/res/andorid"
xmlns:my="/apk/res/com.azz.mygifview"
android:layout_width = "match_parent"
android:layout_height = "match_parent"&
&com.azz.mygifview.MyGifView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
my:gif_src = "@drawable/coffee"/&
&/RelativeLayout&
TypedArray(2)
好,现在回到开始获取TypedArray的地方。
通过查阅源码,我又查到两个方法:
int getIndexCount()
String getText(int index)
什么意思呢?简单组合一下就知道答案了:
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.GifView);
int count = typedArray.getIndexCount();
for (int i = 0; i & count; i++) {
Log.d(TAG, "typedArray = " + typedArray.getText(i));
typedArray.recycle();
typedArray = res/drawable-mdpi/coffee.gif
注意:TypedArray是共享资源,用完一定要用typedArray.recycle();回收
如果自定义属性是color类型,xml设置属性值为#000000,打印出来的也是#000000。可以根据打印猜到些什么了,打印的是属性的值。
那么,如何获取这些属性的具体值呢?
TypedArray提供非常多的get方法,比如
boolean getBoolean(int index, boolean defValue)
float getFloat(int index, float defValue)
int getInt(int index, int defValue)
String getString(int index)
int getResourcesId(int index, int defValue)
Drawable getDrawable(int index)
defValue 看字面意思就知道是 default value-缺省值,当获取不到值时则返回缺省值。
index 是这个属性的索引,用R.styleable.XXX获得属性索引,其实这个索引就是0、1、2…按着attrs.xml里面GifView组里面定义顺序排的(第一行定义的属性(比如gif_src)索引就是0,第二行1…),这个索引值当你保存xml文件的时候,自动在R文件中生成。
int resId = typedArray.getResourceId(R.styleable.GifView_gif_src, 0); //GifView为属性组名,gif_src为具体属性名,他们之间用下划线连接得到索引名(eclipse“点”的时候会出来提示的),其实点击进去发现,GifView_gif_src就等于0
上面是获取图片资源文件id,还可以直接获取图片Drawable类型,如下
Drawable drawable = typedArray.getDrawable(R.styleable.GifView_gif_src);
开始自定义显示Gif
总体而言:我们需要借助 Android SDK 自带的 Movie 类进行播放 gif 动画帧。
之前我们已经获取到了图片的资源文件resId,现在需要先把资源文件转换成movie
InputStream iStream = getResources().openRawResource(resId);
mMovie = Movie.decodeStream(iStream);
因为gif_src是自定义属性,当宽高(layout_width | height)设置为wrap_content的时候,需要我们重新设定尺寸(重写onMeasure()),不然是不会显示出gif图片的。
重定义宽高onMeasure
所以紧接着获取图片宽高
if (mMovie != null) {
Bitmap bitmap = BitmapFactory.decodeStream(iStream);
mWidth = bitmap.getWidth();
mHeight = bitmap.getHeight();
bitmap.recycle();
接着重写onMeasure(),自定义view的尺寸
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mMovie != null) {
setMeasuredDimension(mWidth, mHeight);
这个时候如果xml是这样写
&com.azz.mygifview.MyGifView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:gif_src = "@drawable/coffee"
android:background = "#0000000"/&
可以看到view是宽高等于gif图片的黑色区域
重定义绘图onDraw
剩下最后一步,也是最重要的一步,重写onDraw来实现播放gif动图
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mMovie != null) {
playMovie(canvas);
invalidate();
* 开始播放gif
* canvas 画布
private void playMovie(Canvas canvas) {
if (mMovie == null) {
return false;
long now = SystemClock.uptimeMillis();
if (mMovieStart == 0) {
mMovieStart =
int duration = mMovie.duration();
int relTime = (int)((now - mMovieStart) % duration);
mMovie.setTime(relTime);
mMovie.draw(canvas, 0, 0);
注释代码里已经比较详细了。
这个时候再运行!~
可能出现的问题-黑屏、不显示gif
很糟糕,view还是一片黑!但是我自己加了很多打印,能看出来是在循环播放的,只是不显示!
原来跟Android 4.0有关
解决方法一:
有些4.0以上系统的手机启动了硬件加速功能之后会导致GIF动画播放不出来,因此我们需要在 AndroidManifest.xml 中去禁用硬件加速功能,可以通过指定android:hardwareAccelerated属性来完成
所以只要在 AndroidManifest.xml 中的&application&标签或者&activity&标签里加上android:hardwareAccelerated="false"
如下在 AndroidManifest.xml
&application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:hardwareAccelerated="false"
&/application&
解决方法二
将&uses-sdk /&标签移到文件的最后就可以了。
如下在 AndroidManifest.xml
xmlns:android="/apk/res/android"
package="com.azz.mygifview"
android:versionCode="1"
android:versionName="1.0" &
android:minSdkVersion="8"
android:targetSdkVersion="18" /&
两种方法都亲测有效!
现在再运行,gif终于出来了!
直到做完我才发现,原来是可乐,不是咖啡=。=
源码地址:/Xieyupeng520/MyGifView_V1.0.git
本项目仍有一些不成熟的地方,比如只支持gif,不支持其他格式图片,建议只做学习用。
下一篇《【Android实战】记录自学自定义GifView过程,能同时支持gif和其他图片!【实用篇】》会讲解如何完美解决该问题!
References:
《Android PowerImageView实现,可以播放动画的强大ImageView》
《说说Android中的style和theme》
《[Android实例] 根据好些例子用movie类显示动的gif,但总是连图片都看不到》
本文有些关于理解自定义view属性不清楚的地方,可以看看《Android 深入理解Android中的自定义属性》
如果你有任何问题,欢迎留言告诉我!
版权声明:本文为博主原创文章,未经博主允许不得转载。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有具体过程还要有解析 . _百度作业帮
具体过程还要有解析 .
具体过程还要有解析 .&
原三角形的斜边=√(6²+8²)m²=√100m²=10m扩充后的等腰三角形周长=(6+10)m×2=32m答:扩充后的等腰三角形周长为32米.PhotoMath 让你只要用手机上的相机就能快速解答数学方程序了!还有步骤详解呢
面对满满的数学方程序习题常不知道从何下手?这个由 MicroBlink 所制作的 App,应该可以大大地帮上你的忙。他们所开发的 iOS 与 Windows Phone 应用 PhotoMath(Android 版本预计将会在 2015 年初登场)就如其名,是个可以用手机相机即时运算数学方程序的超神 App。使用的方法也非常简单,就是启用你的相机镜头在红框内对准纸本的数学方程序,便可以马上在画面上获得解答,甚至,你还可以按下选项去看该方程序的步骤详解呢,感觉对于学习应该是个非常方便的工具 -- 至于比较负面的作弊问题... 必须说这样考试可能就要严禁拿出手机了呢,毕竟这真的是一扫就可以看到详解,所以老师可能也要多留心一下了唷。跳转后可以观看开发者的使用示范视频。
比《生活大爆炸》那个版本还差点儿。 这是我见过最好的APP了 连个方程都不会解吗? 你太高估普通老外的计算能力。。。 我在大学的课堂里面亲眼看到老师讲到aa÷2/5=aa*5/2的时候一个老外举手问为什么会这么变化,然后老师讲了三遍之后他似懂非懂的点头,然后下课之后和另外一个老外同学讨论了半天 其实老师还有他的同桌是漂亮妹子他只是找话题搭讪~~。。。。 神APP,请告诉我,小明对小华说:“我正坐在一个你永远也坐不到的地方!”他坐在哪里?神APP:你不就是想让我说小明坐在小华的哔~上么!我才不会上当呢(#`Д?)? 复杂的方程完全不能解嘛,光能解一元一次方程这 App 存在的意义是什么?
对外国人 有 能解微积分么,不能说个毛 代表广大大学生予以呵呵~特么老子小学的时候你在哪? 麻麻再也不用担心我的学习了!so easy! 求那些已毕业人士的心里阴影面积 最最强悍的计算器app是MathStudioapp store上要¥128原身是Windows Mobile时代的Spacetime什么函数微积分矩阵都能算什么样的函数图像都能画高考前一天我拿出手机对着老师玩老师问我在玩什么我说在研究函数然后老师就被我退散了小伙伴都惊奇的望着我…… 当它还叫spacetime的时候限免过,当时iOS还叫iPhone OS,版本号为2.2.1。 你在wolfram的mathematica和alpha兩大法寶面前秀最強大。。。實在是有點呵呵。。。不要說普通人手機的一個app。。。我們搞科研的都天天開着wolfram alpha的網頁
SSH到辦公室電腦用mathematica。。。手機上的計算軟件怎麼也到不了這個地步了。。。 楼上那位。。wolfram alpha,matlab mobile都是必须要求互联网连接的。。并且在国内连wolfram那速度你又不是不知道(在国外的话当我没说) 屌爆了!居然还有WP版比Android版更早发布的app Leonard表示不服 Leonard
是软件吗?问题分类:初中英语初中化学初中语文
当前位置: >
解计算题的一般步骤和要求1:()清题意,寻()解题方法、规律和(),必要时画()帮助分析.2:解的过程包括写()、代入()、算()三步.3:在解的过程中()只写公式和数字,()要把必要的文字说明写出.数字后面要写上正确的().4:一个题目往往涉及()个速度、多个路程、()个时间,解题时应加()将它们分开,否则会导致解题过程和代入数据上的()乱,使结果出()
悬赏雨点:15 学科:【】
解计算题的一般步骤和要求1:(审)清题意,寻(找)解题方法、规律和(技巧),必要时画(图)帮助分析.2:解的过程包括写(公式)、代入(数据)、算(结果)三步.3:在解的过程中(不能)只写公式和数字,(计算过程)要把必要的文字说明写出.数字后面要写上正确的(单位).4:一个题目往往涉及(多个)个速度、多个路程、(多个)个时间,解题时应加(角码)将它们分开,否则会导致解题过程和代入数据上的(混)乱,使结果出(错)
&&获得:15雨点
暂无回答记录。

我要回帖

更多关于 域名解析过程 的文章

 

随机推荐