SurfaceView加载长图

1:SurfaceView加载长图,移到。可以充当背景 效果截图

2:View (淡入淡出动画没实现:记录下)

package com.guoxw.surfaceviewimage;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by guoxw on 2017/12/6.
 * SurfaceView 加载长图缓慢移动显示,充当背景。
 */

public class SurfaceViewImage extends SurfaceView implements SurfaceHolder.Callback {

    private static final String TAG = "SurfaceViewTest1";
    private SurfaceHolder surfaceHolder = null;
    private int imageH = 0, imageW = 0;
    private Bitmap bitmap = null;
    private Paint mBitPaint = null;
    /***每次移动相对于起始点的距离*/
    private int gap = 0;
    private Timer timer;
    private TimerTask timerTask;
    private int surfaceW, surfaceH;
    private ScroListener scroListener = null;
    private Canvas canvas;
    /***设置透明度  0-255 */
    private int alphaValueAdd = 0;
    private int alphaValueDec = 255;
    private boolean isVisibility = true;
    private int transType = 1;

    public SurfaceViewImage(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.d(TAG, "SurfaceViewTest1: ");
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bannerbg2);
        imageH = bitmap.getHeight();
        imageW = bitmap.getWidth();
        mBitPaint = new Paint();
        mBitPaint.setColor(Color.RED);
        mBitPaint.setAlpha(alphaValueDec);
        Log.d(TAG, "SurfaceViewTest1: --寛高:" + imageW + "--" + imageH);
        surfaceHolder = getHolder();
        surfaceHolder.addCallback(this);

    }

    private void imageDraw() {
        Log.d(TAG, "imageDraw: ");
        switch (transType) {
            case 1:
                canvas = surfaceHolder.lockCanvas(new Rect(0, 0, surfaceW, surfaceW));
                if (gap < (imageW - surfaceW)) {
                    if (alphaValueAdd <= 255) {
                        alphaValueAdd += 5;
                    } else {
                        gap += 1;
                    }
                } else if (gap >= (imageW - surfaceW)) {
                    alphaValueDec -= 5;
                    scroListener.scroTopListener();
                    if (alphaValueDec == 0) {
                        Log.d(TAG, "imageDraw: 次数- 000");
                        // scroListener.scroTopListener();
                    }
                }
                if (alphaValueAdd <= 255) {
                    mBitPaint.setAlpha(alphaValueAdd);
                } else {
                    mBitPaint.setAlpha(alphaValueDec);
                }
                Rect srcRect = new Rect(0 + gap, 1000, surfaceW + gap, surfaceH + 1000);
                Rect dstRect = new Rect(0, 0, surfaceW, surfaceH);
                Log.d(TAG, "imageDraw: image数据alpha值:--" + alphaValueDec);
                canvas.drawBitmap(bitmap, srcRect, dstRect, mBitPaint);
                surfaceHolder.unlockCanvasAndPost(canvas);
                break;
            case 2:
                break;
            case 3:
                break;
        }

    }

    public void setBitmap(Bitmap bitmap) {
        resetImageData();
        this.bitmap = bitmap;
    }

    private void resetImageData() {
        imageH = bitmap.getHeight();
        imageW = bitmap.getWidth();
        gap = 0;
        alphaValueDec = 255;
        alphaValueAdd = 0;
    }

    /**
     * 移动完时,设置监听,更换image
     * @param scroListener
     */
    public void setScroListener(ScroListener scroListener) {
        this.scroListener = scroListener;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        surfaceH = getHeight();
        surfaceW = getWidth();
        Log.d(TAG, "surfaceCreated: 控件的寛高:" + surfaceW + "---" + surfaceH); // 1196*574
        timer = new Timer();
        timerTask = new TimerTask() {
            @Override
            public void run() {

                while (isVisibility) {
                    imageDraw();
                }

            }
        };
        timer.schedule(timerTask, 100, 60);

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        Log.d(TAG, "surfaceChanged: ");

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d(TAG, "surfaceDestroyed: ");
        try {
            Canvas canvas = surfaceHolder.lockCanvas(null);
            canvas.drawColor(Color.BLACK);
            surfaceHolder.unlockCanvasAndPost(canvas);
        } catch (Exception ex) {
        }

    }

    public interface ScroListener {
        void scroTopListener();
    }

    public void destory() {

        if (timer != null) {
            timer.cancel();
            timerTask = null;
            timer = null;
        }

    }

}

  Code:

https://pan.baidu.com/s/1o7XYOsy     SurfaceViewImage.zip

  

时间: 2024-10-12 19:28:26

SurfaceView加载长图的相关文章

Android 高清加载长图或大图方案

一.概述 对于加载图片,大家都不陌生,一般为了尽可能避免OOM都会按照如下做法: 对于图片显示:根据需要显示图片控件的大小对图片进行压缩显示. 如果图片数量非常多:则会使用LruCache等缓存机制,将所有图片占据的内容维持在一个范围内. 其实对于图片加载还有种情况,就是单个图片非常巨大,并且还不允许压缩.比如显示:世界地图.清明上河图.微博长图等. 那么对于这种需求,该如何做呢? 首先不压缩,按照原图尺寸加载,那么屏幕肯定是不够大的,并且考虑到内存的情况,不可能一次性整图加载到内存中,所以肯定

Android 高清加载巨图方案 拒绝压缩图片

Android 高清加载巨图方案 拒绝压缩图片

Unity使用脚本进行批量动态加载贴图

先描述一下我正在做的这个项目,是跑酷类音游. 那么跑酷类音游在绘制跑道上的时候,就要考虑不同的砖块显示问题.假设我有了一个节奏列表,那么我们怎么将不同的贴图贴到不同的砖块上去呢? 我花了好几个小时才搞清楚里面的门路,且听我慢慢道来. 首先我们建立一个地图,在上面新建一个Empty Object,将所有的Road砖块全部划分到这个分组里. 效果图如下: 我们得到了一些预制块,接下来我们要将其染上色. 首先的问题是,我们怎么遍历这些砖块呢?很简单,用Tag.我们将所有的砖块打上一个特别的tag,"r

简易仿ios菊花加载loading图

原文链接:https://mp.weixin.qq.com/s/wBbQgOfr59wntNK9ZJ5iRw 项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loading,一般用的比较多的是仿照ios 的菊花加载loading 图,当然一些条件下还会涉及到加载成功/ 失败情况的显示,还有显示文字. 使用ProgressBar 来加载动画转圈,这里使用drawable文件 定义转圈动画,indeterminateDrawable属性进行加载. <?xml vers

H5异步加载多图

异步加载多图(可能没啥用,加载慢)(图片预加载,提前给浏览器缓存图片) 1. 用一个计数变量记录需要加载的图片个数 2. 用new Image()去加载,加载完给此对象的src赋值要加载的url路径(事先加载好图片) 3. 每次加载成功计数加一,加载完成全部调用回调进行下一步操作 4. 此方法可以得知图片什么时候加载完成,示例代码: var img = new Image(); img.onload = () => { // 可以直接使用相同url赋值,此时图片已经预加载完毕 } img.src

Android 高清加载巨图方案, 拒绝压缩图片

源地址:http://blog.csdn.net/lmj623565791/article/details/49300989 一.概述 距离上一篇博客有段时间没更新了,主要是最近有些私事导致的,那么就先来一篇简单一点的博客脉动回来. 对于加载图片,大家都不陌生,一般为了尽可能避免OOM都会按照如下做法: 对于图片显示:根据需要显示图片控件的大小对图片进行压缩显示. 如果图片数量非常多:则会使用LruCache等缓存机制,将所有图片占据的内容维持在一个范围内. 其实对于图片加载还有种情况,就是单个

使用YYAnimatedImageView加载GIF图,并且可以控制只播放一次

1.初始化YYAnimatedImageViewYYAnimatedImageView *imageView = [[YYAnimatedImageView alloc] init];imageView.backgroundColor = [UIColor whiteColor];imageView.contentMode = UIViewContentModeScaleAspectFit;[self.view addSubview:imageView]; 2.加载网络GIF图片[imageVi

解决加载多图oom,内存和硬盘缓冲,过滤重复链接,同一视图没被缓冲前,某些view不显示的问题。

文章,参考自:http://blog.csdn.net/guolin_blog/article/details/34093441 不过本身自己的代码也也修改了很多. 在网络上找了很多例子,但是很多都是,不十分满意, 1.要不就是图片错乱, 2.第一次运行,如果滚动加载过快,要不就是无限多的线程, 3.要不就是在同一视图里面,如果没被缓冲,而且又有相同链接的话,某些视图即不显示出来. 网络下载,我用的是开源框格volley. 异步下载方式: 1.在页面滚动的时候,中断线程,停止下载, 2.页面停止

ARCServer加载专题图不显示——前端加载时强行修改地图服务请求的坐标系

问题描述:这是比较奇葩的一个问题,发布的服务坐标系是2385的,但是通过前端加载代码加载后,得到的请求是4549的,显示不了地图 解决思路:通过调试窗口,查看发送的请求,发现其对应的空间参考是4549.所以应该修改此请求,但是用户放大缩小平移是自动发送的请求,一般来说,地图的空间参考是根据第一次加载的地图来确定的,因而,想到可以修改地图map的空间参考. 解决方法: map.on("load", function () {                map.spatialRefer