自定义控件,实现加载图片时透明变换

自定义控件,一般都是通过继承已有的view类,如TextView,Button。。。或者直接继承其父类View。这次因为要加载图片。所以继承自ImageView。并且实现了一个通过属性来控制的加载时间。首先是自定义的类

  1. /**
  2. *知我者为我心忧,不知我者谓我何求!
  3. *[email protected]
  4. *作者 linwoain
  5. *日期 2014/11/7 9:17
  6. */
  7. package com.linwoain.TestAndroid.fragment;
  8. import android.content.Context;
  9. import android.content.res.TypedArray;
  10. import android.graphics.Canvas;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.util.AttributeSet;
  14. import android.view.View;
  15. import android.widget.ImageView;
  16. import com.linwoain.TestAndroid.R;
  17. import java.util.Timer;
  18. import java.util.TimerTask;
  19. /**
  20. * 自定义控件,实现
  21. * @author linwoain
  22. * @version 2014/11/7 9:17
  23. */
  24. public class AlphaImageView extends ImageView {
  25. private static final int SPEED = 300;//每隔多少毫秒透明度改变一次
  26. private int alphaDelta = 0;//图像透明度每次改变的大小
  27. //记录图片当前的透明度
  28. private int curAlpha = 0;
  29. Handler handler = new Handler() {
  30. @Override
  31. public void handleMessage(Message msg) {
  32. super.handleMessage(msg);
  33. if (msg.what == 0x123) {
  34. curAlpha += alphaDelta;
  35. if (curAlpha > 255) {
  36. curAlpha = 255;
  37. AlphaImageView.this.setAlpha(curAlpha);
  38. }
  39. }
  40. }
  41. };
  42. public AlphaImageView(Context context) {
  43. this(context, null);
  44. }
  45. public AlphaImageView(Context context, AttributeSet attrs) {
  46. super(context, attrs);
  47. TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AlphaImageView);
  48. int duration = typedArray.getInt(R.styleable.AlphaImageView_duration, 0);//默认不透明
  49. alphaDelta = 255 * SPEED / duration;
  50. typedArray.recycle();
  51. }
  52. @Override
  53. protected void onDraw(Canvas canvas) {
  54. this.setAlpha(curAlpha);
  55. super.onDraw(canvas);
  56. final Timer timer = new Timer();
  57. timer.schedule(new TimerTask() {
  58. @Override
  59. public void run() {
  60. Message message = new Message();
  61. message.what = 0x123;
  62. if (curAlpha >= 255) {
  63. timer.cancel();
  64. } else {
  65. handler.sendMessage(message);
  66. }
  67. }
  68. }, 0, SPEED);
  69. }
  70. }

这当中使用了属性AlphaImageView_duration,需要在values目录下新建attrs文件中声明,两种方式

1、不声明类型:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <attr name="duration"></attr>
  4. <declare-styleable name="AlphaImageView">
  5. <attr name="duration"></attr>
  6. </declare-styleable>
  7. </resources>

2、声明类型:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="AlphaImageView">
  4. <attr name="duration" format="integer"></attr>
  5. </declare-styleable>
  6. </resources>

第一种方式,有可能导致编译正确,但运行错误,第二种编译器会拒绝输入错误类型 。其中的AlphaImageView可以是非自定义控件的类名。然后在布局文件中添加一个AlphaImageView实例

  1. <com.linwoain.TestAndroid.fragment.AlphaImageView
  2. app:duration="6000"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:id="@+id/gif"/>

注意,在布局文件中使用自定义控件的属性时,需要引入命名控件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res/com.linwoain.TestAndroid"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. >

如上方所示,①的命名控件为安卓系统提供的控件的命名控件,②是自定义的命名控件,由http://schemas.android.com/apk/res+应用的包名 共同构成!

此时就完成了一个自定义控件!!

来自为知笔记(Wiz)

时间: 2024-11-16 07:14:16

自定义控件,实现加载图片时透明变换的相关文章

加载图片时,图片网址中包含中文参数,无法加载数据

网址示例: NSString *urlstr = @"http://odqaqbbj4.bkt.clouddn.com/pic_中文字段_20160921191844"; 对网址进行转码 NSString *url = [urlstr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\

加载图片时的2种方法

1,仅加载图片,图像数据不会缓存. NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”]; UIImage *image = [UIImage imageWithContentsOfFile:path]; 或 NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”]; NSData *i

微信小程序 加载图片时,先拉长,再恢复正常

今天在写小程序,发现小程序的图片image如过mode设置为widthFix的话, 加载图片会被先拉伸,后恢复正常 我的处理方法是,给他一个初始的height值,或者就直接 height:auto 原文地址:https://www.cnblogs.com/bing0709/p/10729449.html

JS教程之实现加载图片时百分比进度

思路:思路其实很简单,ajax执行时,会生成一个event对象,其中会包含要加载的文件的大小和当前已经加载完成部分的大小,通过这两个值即可计算出百分比 事件介绍onprogress 当浏览器正在加载媒介数据时触发onload 在onprogress事件后,加载媒介数据完毕时触发 附图一张:event对象所包含的所有值,其中total为总大小,loaded为已经加载完的大小(图中显示的为加载一张7M的图片时的progress信息) demo: <script src="http://file

解决Android加载图片时内存溢出的问题

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()

Android 滚动RecyclerView加载图片时的流畅度优化

实现:使用onScrollStateChanged回调检测滚动状态,并在RecyclerViewAdapter内部设置类似isScrolling的状态值来控制网络图片的加载. 下面是代码举例: // BaseAdapter中添加如下代码 public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { …… protected boolea

高效地加载图片(三) 缓存图片

如果只需要加载一张图片,那么直接加载就可以.但是,如果要在类似ListView,GridView或者ViewPager的控件中加载大量的图片时,问题就会变得复杂.在使用这类控件时,在短时间内可能会显示在屏幕上的图片数量是不固定的. 这类控件会通过子View的复用来保持较低的内存占用.而Garbage Collector也会在View被复用时释放对应的Bitmap,保证这些没用用到的Bitmap不会长期存在于内存中.但是为了保证控件的流畅滑动,在一个View再次滑动出现在屏幕上时,我们需要避免图片

iOS网络加载图片缓存与SDWebImage

加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异步的.(自己开线程去下载) *普通为模型增加UIImage属性的方法做的是内存缓存(下次启动还需要从网络重新加载), 而要做本地缓存的话,还要自己手动存储网络上下载的图片. *为了加快访问, 还需要自己去弄缓存.(内存缓存或者本地缓存) *当图片没有下载完成时,还要设置占位图片. 以下代码用NSOp

【iOS】网络加载图片缓存与SDWebImage

加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异步的.(自己开线程去下载) *普通为模型增加UIImage属性的方法做的是内存缓存(下次启动还需要从网络重新加载), 而要做本地缓存的话,还要自己手动存储网络上下载的图片. *为了加快访问, 还需要自己去弄缓存.(内存缓存或者本地缓存) *当图片没有下载完成时,还要设置占位图片. 以下代码用NSOp