实现效果:
该控件防百度阅读的导向栏进行研究,具体细节尚有不足,希望大家多多指点点击打开链接
Viewpager的滑动,引起标题栏的渐变。主要渐变过程要先画线,再画点。
画线过程:
利用path和PathMeasure类,画出一条曲线,moveto方法画起始点,quadTo方法画中间控制点和终点,由于现在是水平移动,中间控制点的坐标一般选图片最上端和
最下端。画出曲线。利用PathMeasure的getPosTan方法,获取在这个线上长度为传入第一个参数的长度的点的坐标,从而接着画图片上的点。
画线具体代码:
@Override
public void buildPaths(float endX, float endY) {
if (mBmpWidth <= 0 || mBmpHeight <= 0) {
throw new IllegalArgumentException(
"Bitmap size must be > 0, did you call setBitmapSize(int, int) method?");
}
mFirstPathMeasure.setPath(mFirstPath, false);
mSecondPathMeasure.setPath(mSecondPath, false);
float w = mBmpWidth;
float h = mBmpHeight;
mFirstPath.reset();
mSecondPath.reset();
mFirstPath.moveTo(0, h/2-10);
mSecondPath.moveTo(0, h/2+10);
// Log.i("yunli", "endX = " + endX + ",endY = " + endY +",w = " + w + ",h = " + h);
mFirstPath.quadTo((endX ) / 4, 10, endX/2, 10);
mSecondPath.quadTo((endX ) / 4, h-10, endX/2, h-10);
mFirstPath.quadTo((3*endX ) / 4, 10, endX, endY-4);
mSecondPath.quadTo((3*endX ) / 4,h-10, endX, endY+4);
} 画图片:
按照画出的曲线进行画图,也就是填充点,主要利用贝塞尔曲线绘画和PathMeasure的getPosTan方法获取指定长度点的坐标:
代码如下:
@Override
public void buildMeshes(int timeIndex) {
// long temp = System.currentTimeMillis();
if (mBmpWidth <= 0 || mBmpHeight <= 0) {
throw new IllegalArgumentException(
"Bitmap size must be > 0, did you call setBitmapSize(int, int) method?");
}
mFirstPathMeasure.setPath(mFirstPath, false);
mSecondPathMeasure.setPath(mSecondPath, false);
int index = 0;
float[] pos1 = {0.0f, 0.0f};
float[] pos2 = {0.0f, 0.0f};
float firstLen = mFirstPathMeasure.getLength();
float secondLen = mSecondPathMeasure.getLength();
float len1 = firstLen / mHorizontalSplit;
float len2 = secondLen / mHorizontalSplit;
float firstPointDist = timeIndex * len1;
float secondPointDist = timeIndex * len2;
for (int x = 0; x <= mHorizontalSplit; x++) {
mFirstPathMeasure.getPosTan(x * len1 + firstPointDist, pos1, null);
mSecondPathMeasure.getPosTan(x * len2 + secondPointDist , pos2, null);
float fx1 = pos1[0];
float fx2 = pos2[0];
float fy1 = pos1[1];
float fy2 = pos2[1];
float dy = fy2 - fy1;
float dx = fx2 - fx1;
for (int y = 0; y <= mVerticalSplit; y++) {
float fx = dx * y / mVerticalSplit;
float fy = dy * y / mVerticalSplit;
mVertices[index * 2 + 0] = fx + fx1;
mVertices[index * 2 + 1] = fy + fy1;
index += 1;
}
}
} 由于双向动画,需定义左右两个Mesh,利用View的OnDraw方法绘画,canvas的drawBitmapMesh方法填充<span style="font-size:18px;"><span style="white-space:pre"> </span>mVertices<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">所有的点</span></span>
最后附上资源下载链接。
http://download.csdn.net/detail/ahjxly/8539677
原文:http://blog.csdn.net/ahjxly/article/details/44679353