Drawable:
Drawable就是一个可画的对象,表示一种可以在Canvas上进行绘制的抽象的概念,其可能是一张(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象,就可以将这个可画对象当作一块“画布(Canvas)”,在其上面操作可画对象,并最终将这种可画对象显示在画布上,有点类似于“内存画布“。
HorizontalScrollView+Drawable 实现案列:
自定义drawable
大体思路:
1>在HorizontalScrollView的onTouch()中监听ACTION_MOVE事件
2>getScrollX()得到HorizontalScrollView滑动距离找到两张渐变的图片的下标
3>HorizontalScrollView中设置图片的level 会在Drawable的onLevelChange()方法中监听到level变化
4>level变化 调用invalidateSelf()重新绘制 调用Drawable自身draw()
5>最后抠图绘制到屏幕上 抠图api Gravity.apply(......)
//从一个已有的bounds矩形边界范围中抠出一个矩形r
Gravity.apply(
gravity,//从左边还是右边开始抠
w,//目标矩形的宽
h, //目标矩形的高
bounds, //被抠出来的rect
r);//目标rect
canvas.save();//保存画布
canvas.clipRect(r);//切割
mUnselectedDrawable.draw(canvas);//画
canvas.restore();//恢复之前保存的画布
完整代码:
RevealDrawable.java
package com.dn_alan.myapplication;
import android.annotation.SuppressLint;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Gravity;
public class RevealDrawable extends Drawable {
private static final String TAG = "Reveal";
private final Rect mTmpRect = new Rect();
private Drawable mUnselectedDrawable;
private Drawable mSelectedDrawable;
private int mOrientation;
public static final int HORIZONTAL = 1;
public static final int VERTICAL = 2;
public RevealDrawable(Drawable unselected, Drawable selected, int orientation) {
mUnselectedDrawable = unselected;
mSele