图片循环滚动控件ScrollingImageView
2016-03-02 20:58
357 查看
设置一个图片,控件可以自动循环滚动,单张图片首尾拼接
参考github开源项目:
https://github.com/Q42/AndroidScrollingImageView
/** * 可滚动的ImageView控件,使用startRolling(int) 或者 startRolling(Bitmap)启动滚动 * @author brian512 */ public class ScrollingImageView extends View { public final float SPEED_SLOW = 1f; public final float SPEED_NORMAL = 3f; public final float SPEED_FAST = 10f; private Bitmap mBitmap; private int mResourceID = 0; private float mSpeed = SPEED_NORMAL; private Rect clipBounds = new Rect(); // 用于保存边界信息 private float offset = 0; // 记录起始位置,需要拼接 private boolean mIsScrolling; // 标记是否开始滚动 public ScrollingImageView(Context context) { this(context, null, 0); } public ScrollingImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ScrollingImageView(Context context, AttributeSet attrs, int styleID) { super(context, attrs, styleID); //startScroll(R.drawable.loading_bg); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), heightMeasureSpec); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); if (canvas == null) { return; } Bitmap bitmap = getBitmap(); if (bitmap == null || bitmap.isRecycled()) { return; } canvas.getClipBounds(clipBounds); int width = bitmap.getWidth(); while (offset <= -width) { offset += width; } float left = offset; while (left < clipBounds.width()) { canvas.drawBitmap(bitmap, getBitmapLeft(width, left), 0, null); left += width; } if (mIsScrolling && mSpeed != 0) { offset -= Math.abs(mSpeed); postInvalidateOnAnimation(); } } private Bitmap getBitmap() { if (mBitmap == null) { mBitmap = BitmapFactory.decodeResource(getResources(), mResourceID); } return mBitmap; } private float getBitmapLeft(float layerWidth, float left) { if (mSpeed < 0) { return clipBounds.width() - layerWidth - left; } else { return left; } } /** * 开始滚动 */ public void startScroll(int imageID) { if (imageID <= 0) { return; } mResourceID = imageID; start(); } /** * 开始滚动 */ public void startScroll(Bitmap bitmap) { if (bitmap == null || bitmap.isRecycled()) { return; } mBitmap = bitmap; start(); } private void start() { if (!mIsScrolling) { mIsScrolling = true; postInvalidateOnAnimation(); } } /** * 停止滚动 */ public void stop() { if (mIsScrolling) { mIsScrolling = false; invalidate(); } } /** * 设置滚动速度 * @param speed 速度,默认为 SPEED_NORMAL = 3f */ public void setSpeed(float speed) { this.mSpeed = speed; if (mIsScrolling) { postInvalidateOnAnimation(); } } /** * 获取滚动速度 * @return */ public float getSpeed() { return mSpeed; } /** * 是否在滚动 * @return */ public boolean getIsScrolling() { return mIsScrolling; } }
参考github开源项目:
https://github.com/Q42/AndroidScrollingImageView
相关文章推荐
- Android编程UI设计之GridView和ImageView的用法
- 基于Android实现随手指移动的ImageView
- Android中ImageView用法实例分析
- javascript实现状态栏文字首尾相接循环滚动的方法
- 多种JQuery循环滚动文字图片效果代码
- jQuery实现列表自动滚动循环滚动展示新闻
- jQuery实现自动与手动切换的滚动新闻特效代码分享
- 兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
- Android程序开发之动态设置ImageView的亮度
- Android实现GridView中ImageView动态变换的方法
- Android控件之ImageView用法实例分析
- 实例解析Android ImageView的scaleType属性
- Android UI之ImageView实现图片旋转和缩放
- Android手势滑动实现ImageView缩放图片大小
- Android编程实现ImageView图片抛物线动画效果的方法
- Android编程简单实现ImageView点击时背景图修改的方法
- android ImageView 的几点经验总结
- Android控件系列之ImageView使用方法
- Android中通过反射实现圆角ImageView代码实例
- Android实现手势控制ImageView图片大小