用PickerView仿电台频道切换

前面用ScrollView写了一个,存在很多缺陷,选择目标只能是最中间,还不能循环,有点坑。于是还换过ViewPager来进行循环切换,这个也有点坑,不适用于我想要效果,ViewPager的切换效果可以参考这里这里

上面的效果图参考PickerView修改而来的,如果满意,且喜欢这种效果就往下看,实现原理还是去参考原作者的吧,且我也只分析怎么从PickerView变过来。

将PickerView变成横向

mMoveLenX += event.getX() - mLastDownX;
// 省略源码
mLastDownX = event.getX();

修改选中 text

mMinTextSize = (float) (mViewHeight * 0.2);
mMaxTextSize = (float) (mViewHeight * 0.25);
mViewItemWidth = (float) (mViewHeight * 1.5);

先定义一下字体的大小,和Item的宽度,选中放大字体为高度的0.25倍,正常字体为高度的0.2倍,子View宽度为高度的1.5倍

// 绘制选中的text
float scale = parabola(mMaxTextSize, mMoveLenX);
float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize;
mPaint.setTextSize(size);
mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha));
// --- text居中绘制,注意baseline的计算才能达到居中,y值是text中心坐标
float x = (float) (mViewWidth / 2.0 + mMoveLenX);
FontMetricsInt fmi = mPaint.getFontMetricsInt();
float baseline = (float) (mViewHeight - size - (fmi.bottom / 2.0 + fmi.top / 2.0));
String text = mDataList.get(mCurrentSelected);
canvas.drawText(text, x, baseline, mPaint);

if (bgScaleX == -1) {
    bgScaleX = mViewItemWidth / bg.getWidth();
    bgScaleY = getHeight() * 0.5f / bg.getHeight();
    pointScale = getHeight() * 1.0f / point.getHeight();
}
mMatrix.setScale(bgScaleX, bgScaleY);
mMatrix.postTranslate(x - mViewItemWidth / 2, getHeight() * 0.125f);
canvas.drawBitmap(bg, mMatrix, mPaint);

再绘制选中的Text,我将Text内容放在了底部 - (float) (mViewHeight - size - (fmi.bottom / 2.0 + fmi.top / 2.0)),接下来就是放了电台底图在上半部,正好是一半,图片起始位从1/8H - 0.125f开始

修改左右两测Text

/**
 * @param canvas
 * @param position 距离mCurrentSelected的差值
 * @param type     1表示左测绘制,-1表示右测绘制
 */
private void drawOtherText(Canvas canvas, int position, int type) {
    float d = mViewItemWidth * position + type * mMoveLenX;
    float x = (float) (mViewWidth / 2.0 + type * d);
    if (x < -mViewItemWidth || x > mViewItemWidth + mViewWidth) {
        return;
    }

    float scale = parabola(mMaxTextSize, d);
    float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize;
    mPaint.setTextSize(size);
    mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha));
    FontMetricsInt fmi = mPaint.getFontMetricsInt();
    float baseline = (float) (mViewHeight - size - (fmi.bottom / 2.0 + fmi.top / 2.0));
    canvas.drawText(mDataList.get(mCurrentSelected + type * position), x, baseline, mPaint);

    mMatrix.setScale(bgScaleX, bgScaleY);
    mMatrix.postTranslate(x - mViewItemWidth / 2, getHeight() * 0.125f);
    canvas.drawBitmap(bg, mMatrix, mPaint);
}

再接下来绘制左右两测的图片,原理和绘制中间的差不多,就是多添加了一项过滤,当需要绘制的View超过的边界一个ItemView的距离时,直接return掉了 - if (x < -mViewItemWidth || x > mViewItemWidth + mViewWidth) {return;}

下载源码

参考:
http://blog.csdn.net/zhongkejingwang/article/details/38513301

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值