当前标签 / 自定义View / 总共2篇

Android内部分享[12]——Android中自定义View和ViewGroup

View 和 ViewGroup 的关系

在开始自定义组件 View 和 ViewGroup 之前我们先来理解一下它们之间的关系,在 Android 中所有 UI 视图组件的根类是 View,而 ViewGroup 继承自 View,但是需要注意的是 ViewGroup 是一个抽象类.

android.view.View 类:

@UiThread
public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {
    //...
}

android.view.ViewGroup 类:

@UiThread
public abstract class ViewGroup extends View implements ViewParent, ViewManager {

    protected ArrayList<View> mDisappearingChildren;

    //...
}

从上面代码可以看出来一个 ViewGroup 中可以包含多个 View,也就是说 ViewGroup 既是一个容器又是一个 View,这样就可以将 ViewGroup 也作为 View 添加到这个集合中了,于是就可以形成如下图所示的树状结构。

Android 视图树状结构关系

阅读更多

Android实现的一个点赞动画

摘要

使用Canvas和状态模式实现一个点赞效果

点赞动画效果

关键步骤

1. 获取Bitmap对象和Bitmap对象释放。

创建

BitmapFactory.decodeResource(getResources(), R.drawable.encourage_gif_big);

回收

if(bitmap != null && !bitmap.isRecycled()){   
        bitmap.recycle();   
        bitmap = null;   
}   
System.gc();  

如果图片过大可以压缩

//压缩,用于节省BITMAP内存空间--解决BUG的关键步骤    
BitmapFactory.Options opts = new BitmapFactory.Options();   
opts.inSampleSize = 2;    //这个的值压缩的倍数(2的整数倍),数值越小,压缩率越小,图片越清晰    
   
//返回原图解码之后的bitmap对象    
bitmap = BitmapFactory.decodeResource(Context, ResourcesId, opts); 

2. 创建画笔,设置画笔。

mBitmapPaint = new Paint();
mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setAlpha(255);

3. canvas绘制Bitmap

float scale = 1 - (1f - END_SCALE) / TOTAL_TIME * currentTime;
Matrix matrix = new Matrix();
matrix.postScale(scale, scale, mWidth / 2, mHeight / 2);
canvas.drawBitmap(mLikesBitmap, matrix, mBitmapPaint);

4. 分析动画状态,分解状态

动画状态

将动画过程分解成几个阶段,然后定义基类(模板方法)

5. 计算各个状态的变化过程,用总时间等分绘制。

float scale = 1 - (1f - END_SCALE) / TOTAL_TIME * currentTime;

关键点

  1. 简单自定义View实现

重写onDraw()

  1. 状态模式的使用

分解状态,将复杂问题拆分解决的思路。

阅读更多