【达内课程】自定义控件(字幕移动)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010356768/article/details/89422245

创建CustomSurfaceView

public class CustomSurfaceView extends SurfaceView {

    int viewWidth,viewHeight;
    //管理surfaceview
    SurfaceHolder surfaceHolder;
    public CustomSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        surfaceHolder = getHolder();
        MyCallback myCallback = new MyCallback();
        surfaceHolder.addCallback(myCallback);
    }

    class MyCallback implements SurfaceHolder.Callback{

        //surfaceview创建完成
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {

        }
        //surfaceview大小发生变化
        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

        }
        //
        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

        }
    }
}

activity_main布局中使用控件

    <com.xx.customsurfaceview.CustomSurfaceView
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

先了解下执行流程:
surfaceCreated——>surfaceChanged
如果单击返回键执行:
surfaceDestroyed

在这里插入图片描述

public class CustomSurfaceView extends SurfaceView {

    int viewWidth,viewHeight;
    //管理surfaceview
    SurfaceHolder surfaceHolder;

    Thread thread;
    public CustomSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        surfaceHolder = getHolder();
        MyCallback myCallback = new MyCallback();
        surfaceHolder.addCallback(myCallback);
    }

    class MyRunnable implements Runnable {

        @Override
        public void run() {
            Canvas canvas = null;
            //view是把内容直接画到屏幕上
            //surfaceview先把内容画到内存
            try {
                canvas = surfaceHolder.lockCanvas();
                Paint paint = new Paint();
                paint.setColor(Color.RED);

                //画背景
                Rect rect = new Rect(0,0,viewWidth,viewHeight);
                canvas.drawRect(rect,paint);
                //画文字
                paint.setColor(Color.GREEN);
                paint.setTextSize(48);
                canvas.drawText("1064",50,200,paint);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //把内存画好的东西画到屏幕上
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }

    class MyCallback implements SurfaceHolder.Callback{

        //surfaceview创建完成
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            thread = new Thread(new MyRunnable());
            thread.start();
        }
        //surfaceview大小发生变化
        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
            viewWidth = i1;
            viewHeight = i2;
        }
        //
        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

        }
    }
}

现在绘制以下效果
在这里插入图片描述

public class CustomSurfaceView extends SurfaceView {
	......
    Bitmap heart1,heart2;
    int imageX;
    int direction;
    final static int left = 1;
    final static int right = 2;
    boolean isRunning = true;

    public CustomSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        ......

        heart1 = BitmapFactory.decodeResource(getResources(),R.mipmap.heart1);
        heart2 = BitmapFactory.decodeResource(getResources(),R.mipmap.heart2);

    }

    class MyRunnable implements Runnable {

        @Override
        public void run() {
            while(isRunning){
                Canvas canvas = null;
                //view是把内容直接画到屏幕上
                //surfaceview先把内容画到内存
                try {
                   ......
                   
                    //画图
                    //direction是移动方向
                    if(direction == right){
                        imageX = imageX + 20;
                        canvas.drawBitmap(heart1,imageX,100,paint);
                    }else{
                        imageX = imageX - 20;
                        canvas.drawBitmap(heart2,imageX,100,paint);
                    }
                    //<0说明在最左边
                    if(imageX < 0){
                        direction = right;
                    }
                    //如果大于屏幕宽度,说明移到了最右边
                    if(imageX > viewWidth){
                        direction = left;
                    }

                    Thread.currentThread().sleep(100);


                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    //把内存画好的东西画到屏幕上
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }

    class MyCallback implements SurfaceHolder.Callback{

        //surfaceview创建完成
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            thread = new Thread(new MyRunnable());
            thread.start();
        }
        //surfaceview大小发生变化
        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
            viewWidth = i1;
            viewHeight = i2;
            //开始图片在最右边
            imageX = i1 ;
        }
        //
        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
            isRunning = false;
        }
    }
}

其中heart1、heart2是两张png图片

现在实现文字移动效果
在这里插入图片描述

public class CustomSurfaceView extends SurfaceView {
	......
    String[] stringArray = {"Errol_King","代码狂欢到深夜"};
    int stringY;

   ......

    class MyRunnable implements Runnable {

        @Override
        public void run() {
            while(isRunning){
                Canvas canvas = null;
                //view是把内容直接画到屏幕上
                //surfaceview先把内容画到内存
                try {
                    canvas = surfaceHolder.lockCanvas();
                    Paint paint = new Paint();
                    paint.setColor(Color.RED);

                    //画背景
                    Rect rect = new Rect(0,0,viewWidth,viewHeight);
                    canvas.drawRect(rect,paint);
                    //画文字
                   ......

                    //画图
                    ......

                    //画文字
                    paint.setColor(Color.WHITE);
                    paint.setTextSize(70);
                    stringY = stringY - 20;
                    for(int i=0;i<stringArray.length;i++){
                        //假定每行高50
                        int y = stringY + i*70;
                        canvas.drawText(stringArray[i],50,y,paint);
                    }
                    Thread.currentThread().sleep(100);


                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    //把内存画好的东西画到屏幕上
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }

   ......
}

Demo下载

猜你喜欢

转载自blog.csdn.net/u010356768/article/details/89422245
今日推荐