SurfaceView

SurfaceView

目前所学用途:

视频弹幕:

彩色弹幕,随机RGB值,进行实时刷新

package com.example.h_04_2;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.IOException;
import java.util.ArrayList;

public class Main2Activity extends AppCompatActivity implements SurfaceHolder.Callback {
    SurfaceView surfaceView_video;//播放视频
    SurfaceView surfaceView_dango;//弹幕
    SurfaceHolder surfaceHolder;
    SurfaceHolder surfaceHolder_danmu;//弹幕
    MediaPlayer mediaPlayer=new MediaPlayer();
    EditText editText;
    Button but;
    ArrayList<DanMu> list=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        but=findViewById(R.id.but);
        editText=findViewById(R.id.editText);
        list.add(new DanMu("撒打发斯蒂芬发送到",0,50,Color.GREEN,50));
        list.add(new DanMu("是打发第三方",0,160,Color.YELLOW,50));
        list.add(new DanMu("水电费三顿饭发",0,230,Color.BLUE,50));
        list.add(new DanMu("撒发大水发双方都",0,300,Color.RED,50));

        but.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //产生随机高度 0-400
                int y= (int) (Math.random()*400);
                list.add(new DanMu(editText.getText().toString(),0,y,Color.RED,50));
            }
        });
        //视频的
        surfaceView_video=findViewById(R.id.surfaceView_video);
        surfaceHolder=surfaceView_video.getHolder();
        surfaceHolder.addCallback(this);
        //弹幕的
        surfaceView_dango=findViewById(R.id.surfaceView_dango);
        surfaceHolder_danmu=surfaceView_dango.getHolder();
        surfaceHolder_danmu.addCallback(this);

        //将弹幕变成透明
        surfaceView_dango.setZOrderOnTop(true);
        surfaceHolder_danmu.setFormat(PixelFormat.TRANSLUCENT);//透明

        initMedia();
    }

    private void initMedia() {
        mediaPlayer.reset();//充值
        try {
            mediaPlayer.setDataSource("http://wvideo.spriteapp.cn/video/2019/0708/5d2223bca3823_wpd.mp4");
            mediaPlayer.prepareAsync();//异步准备 网络资源
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if(holder==surfaceHolder){
            //将视频放到holder里面播放
            mediaPlayer.setDisplay(holder);

        }else{//启动线程发送弹幕
            new MovieThread().start();

        }

    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
    int x=0;

    class MovieThread extends Thread{
        @Override
        public void run() {
            super.run();
            Paint paint=new Paint();
            paint.setTextSize(50);
            while(true){
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Canvas canvas = surfaceHolder_danmu.lockCanvas();
                if(canvas==null){
                    break;
                }
                canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                //遍历集合
                for(int i=0;i<list.size();i++){
                    //修改x的坐标
                    int x = list.get(i).getX();
                    list.get(i).setX(x+=10);
                    //修改画笔
                    paint.setColor(list.get(i).getColor());
                    paint.setTextSize(list.get(i).getSize());
                    canvas.drawText(list.get(i).getText(),list.get(i).getX(),list.get(i).getY(),paint);
                }

                surfaceHolder_danmu.unlockCanvasAndPost(canvas);
            }
            }
        }
}

Recyclerview

对于瀑布流图片的屏幕适配代码:

需要获取图片的宽和高,来进行图片控件的适配


ViewGroup.LayoutParams params=item1.img.getLayoutParams();
        DisplayMetrics metrics=mainActivity.getResources().getDisplayMetrics();
        params.width=metrics.widthPixels/2;
        double v = params.width * 1.0 /Integer.valueOf(list.get(i).getWidth());
        params.height= (int) (Integer.valueOf(list.get(i).getHeight())*v);
        item1.img.setLayoutParams(params);
        

目前对于万能适配器的图片控件并不是太理想,原因猜测为内容和创建item分离,造成适配为题, 此处还需要研究

具体解决办法未知,时间不足,待定

心情:菜:原因:学习懵逼,二狗子不理我, 烦 不想写作业 一直不想写

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值