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分离,造成适配为题, 此处还需要研究
具体解决办法未知,时间不足,待定
心情:菜:原因:学习懵逼,二狗子不理我, 烦 不想写作业 一直不想写