正如你在他们的实现中所知,他们使用并更新了ListAdapter中的固定位置,然后他们更新了相应匹配的View,这对我来说是最简单,最简单的方法,但你没有得到半个半彩色文字,我觉得你还想要:)
所以这可能是我给出的最糟糕的答案之一,对不起,我可能会重温这一点,或希望有人能指出你更好的解决方案
您可以在以下位置看到模糊的演示:
肮脏的方式:
>使用适当的ColorMatrixColorFilter创建一个Paint,为了回答这个问题我只是去饱和,你必须找出ColorMatrix的5×4矩阵来获得你想要的青色.在下面绘制时,您还需要一些Rects来定义source和dest.
>创建一个用于绘制列表的屏幕外的Bitmap和Canvas,这是在onSizeChanged中完成的,所以我们有适当的视图布局值,在这里你可以开始注意肮脏,因为你必须分配一个像ListView一样大的Bitmap所以你可能会得到OutOfMemoryException.
>覆盖绘图以使用你的屏幕外画布并让ListView绘制到它,然后你可以将Bitmap绘制到将照常绘制列表的给定Canvas,然后绘制该Bitmap的一部分,将使用Paint绘制不同的部分我们之前定义过,你会得到那些像素的透支.
>最后绘制预制玻璃Bitmap,我会推荐一个n-patch(9-patch),因此它可以在屏幕和密度上进行缩放和显示,然后您可以为这些像素获得更多的透支.
整个蛋糕看起来像:
public class OverlayView extends ListView {
private RectF mRect;
private Rect mSrcRect;
private Paint mPaint;
private Canvas mCanvas;
private Bitmap mBitmap;
private float mY;
private float mItemHeight;
public OverlayView(Context context) {
super(context);
initOverlay();
}
public OverlayView(Context context, AttributeSet attrs) {
super(context, attrs);
initOverlay();
}
public OverlayView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initOverlay();
}
private void initOverlay() {
// DO NOT DO THIS use attrs
final Resources res = getResources();
mY = res.getDimension(R.dimen.overlay_y);
mItemHeight = res.getDimension(R.dimen.item_height);
//
mRect = new RectF();
mSrcRect = new Rect();
mPaint = new Paint();
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0);
mPaint.setColorFilter( new ColorMatrixColorFilter(colorMatrix) );
}
@Override
public void draw(Canvas canvas) {
super.draw(mCanvas);
canvas.drawBitmap(mBitmap, 0, 0, null);
canvas.drawBitmap(mBitmap, mSrcRect, mRect, mPaint);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mRect.set(0, mY, w, mY + mItemHeight);
mRect.roundOut(mSrcRect);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
}
所以说,我希望你最终得到一个更清洁的解决方案,即使你没有达到半个半性感:)