直播系統原始碼,圖片一直滾動,迴圈滾動,豎向和橫向

zhibo系統開發發表於2021-11-24

直播系統原始碼,圖片一直滾動,迴圈滾動,豎向和橫向實現的相關程式碼

豎向:


public class LoopScrollView extends View {
    private final int speed;
    private final Bitmap bitmap;
 
    private Rect clipBounds = new Rect();
    private float offset = 0;
 
    private boolean isStarted;
 
    public LoopScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ParallaxView, 0, 0);
        try {
            speed = ta.getDimensionPixelSize(R.styleable.ParallaxView_speed, 10);
            bitmap = BitmapFactory.decodeResource(getResources(), ta.getResourceId(R.styleable.ParallaxView_src, 0));
        } finally {
            ta.recycle();
        }
//        start();
    }
 
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(bitmap.getWidth(), MeasureSpec.getSize(heightMeasureSpec));
    }
 
    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (canvas == null) {
            return;
        }
 
        canvas.getClipBounds(clipBounds);
 
        float normalizedOffset = offset;
        float layerHeight = bitmap.getHeight();
 
        if (offset <= -layerHeight) {
            offset += (floor(abs(normalizedOffset) / layerHeight) * layerHeight);
        }
 
        float top = offset;
        while (top < clipBounds.height()) {
            canvas.drawBitmap(bitmap, 0, getBitmapTop(layerHeight, top), null);
            top += layerHeight;
        }
 
        if (isStarted) {
            offset -= speed;
            postInvalidateOnAnimation();
        }
    }
 
    private float getBitmapTop(float layerHeight, float top) {
        float bitmapTop = top;
        if (speed < 0) {
            bitmapTop = clipBounds.height() - layerHeight - top;
        }
        return bitmapTop;
    }
 
    /**
     * Start the animation
     */
    public void start() {
        if (!isStarted) {
            isStarted = true;
            postInvalidateOnAnimation();
        }
    }
 
    /**
     * Stop the animation
     */
    public void stop() {
        if (isStarted) {
            isStarted = false;
            invalidate();
        }
    }
}


橫向:


public class LoopScrollView extends View {
    private final int speed;
    private final Bitmap bitmap;
 
    private Rect clipBounds = new Rect();
    private int offset = 0;
 
    private boolean isStarted;
 
    public LoopScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ParallaxView, 0, 0);
        try {
            speed = ta.getDimensionPixelSize(R.styleable.ParallaxView_speed, 10);
            bitmap = BitmapFactory.decodeResource(getResources(), ta.getResourceId(R.styleable.ParallaxView_src, 0));
        } finally {
            ta.recycle();
        }
        start();
    }
 
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), bitmap.getHeight());
    }
 
    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (canvas == null) {
            return;
        }
 
        canvas.getClipBounds(clipBounds);
 
        int normalizedOffset = offset;
        int layerWidth = bitmap.getWidth();
        if (offset < -layerWidth) {
            offset += (int) (floor(abs(normalizedOffset) / (float) layerWidth) * layerWidth);
        }
 
        int left = offset;
        while (left < clipBounds.width()) {
            canvas.drawBitmap(bitmap, getBitmapLeft(layerWidth, left), 0, null);
            left += layerWidth;
        }
 
        if (isStarted) {
            offset -= speed;
            postInvalidateOnAnimation();
        }
    }
 
    private float getBitmapLeft(int layerWidth, int left) {
        float bitmapLeft = left;
        if (speed < 0) {
            bitmapLeft = clipBounds.width() - layerWidth - left;
        }
        return bitmapLeft;
    }
 
    /**
     * Start the animation
     */
    public void start() {
        if (!isStarted) {
            isStarted = true;
            postInvalidateOnAnimation();
        }
    }
 
    /**
     * Stop the animation
     */
    public void stop() {
        if (isStarted) {
            isStarted = false;
            invalidate();
        }
    }
}


以上就是直播系統原始碼,圖片一直滾動,迴圈滾動,豎向和橫向實現的相關程式碼, 更多內容歡迎關注之後的文章


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2843864/,如需轉載,請註明出處,否則將追究法律責任。

相關文章