SurfaceView 案例 正余弦 简单的播放视频

本文详细介绍了使用SurfaceView在Android中绘制动态正弦波和余弦波的方法。通过创建自定义线程,利用数学公式计算坐标,实现了波形的动态绘制效果。同时,提供了完整的代码示例和布局文件,帮助读者快速理解和实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SurfaceView画板画正余弦

在这里插入图片描述

    class DrawsinLine extends Thread {
        //        private boolean os = false;//判断是否已经画完了
        private int xStartX = 10; //X轴的起始X坐标
        private int xStartY = 520; //X轴的起始Y坐标
        private int xEndX = 1000; //X轴的结束X坐标
        private int xEndY = 520; //X轴的结束Y坐标

        private int yStartX = 10; //Y轴的起始X坐标
        private int yStartY = 30; //Y轴的起始y坐标
        private int yEndX = 10; //Y轴的结束X坐标
        private int yEndY = 1000; //Y轴的结束y坐标
        private Path Sinpath = new Path();
        private Path Sinpath1 = new Path();

        @Override
        public void run() {
            super.run();

            paint.setColor(Color.BLUE);
            int x = yStartX;//正弦波的起始X坐标
            int y = xStartY;//正弦波的起始Y坐标
            Sinpath.moveTo(x, y);
            Sinpath1.moveTo(x, y);

            while (true) {
                canvas = surfaceHolder.lockCanvas();//让该线程占有画布
                // 画x轴
                canvas.drawLine(xStartX, xStartY, xEndX, xEndY, paint);
                //画y轴
                canvas.drawLine(yStartX, yStartY, yEndX, yEndY, paint);

                                                //正余弦公式 -余弦 + 正弦
                int newy = y - (int) (100 * Math.sin((x - 5) * 2 * Math.PI / 150));//计算y坐标
                int newy1 = y + (int) (100 * Math.sin((x - 5) * 2 * Math.PI / 150));//计算y坐标

                Sinpath.lineTo(x, newy);//将path 链接 构成新的坐标点
                Sinpath1.lineTo(x, newy1);//将path 链接 构成新的坐标点
                x++;
                canvas.drawPath(Sinpath, paint);
                canvas.drawPath(Sinpath1, paint);

                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (x > 1000) {
                    break;
                }
                surfaceHolder.unlockCanvasAndPost(canvas);
            }

        }
    }

如何启动 以及如何初始化控件请链接————https://blog.youkuaiyun.com/SageDeceiveFiend/article/details/91471220

在这里插入图片描述

在这里插入图片描述

//布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MidPlayer.VideoActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <SeekBar
            android:id="@+id/sb"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <SurfaceView
            android:id="@+id/vidosv"
            android:layout_width="match_parent"
            android:layout_height="500dp" />

        <Button
            android:id="@+id/startbtn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="播放" />

        <Button
            android:id="@+id/stopbtn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="暂停"></Button>


    </LinearLayout>
</RelativeLayout>
//Activity代码
package com.example.day04.MidPlayer;

import android.annotation.TargetApi;
import android.media.MediaPlayer;
import android.media.TimedText;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.SeekBar;

import com.example.day04.R;

import java.io.IOException;

//视频播放
public class VideoActivity extends AppCompatActivity implements View.OnClickListener, SurfaceHolder.Callback, SeekBar.OnSeekBarChangeListener {
    private SurfaceView videoSurfaceView;
    private SurfaceHolder surfaceHolder;
    private MediaPlayer mediaPlayer;

    private SeekBar seekBar;
    private int time;

    private boolean isPlaying;//标志位,来判断当前视频是否正在播放
    private boolean isPause;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        initView();
        initMediaPlayer();

    }


    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(isPause==false){
                seekBar.setProgress(time * 1000);
                Message message = new Message();
                time++;
                handler.sendMessageDelayed(message, 1000);
            }

        }
    };


    private void initMediaPlayer() {
        mediaPlayer = new MediaPlayer();

        try {

            //mediaPlayer.setDataSource("/sdcard/newyear.mp4");//配置播放MP4文件源。
            Uri uri = Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
            mediaPlayer.setDataSource(this, uri);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //设置一个回调函数,当mediaplayer准备好之后,会回调该函数。
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer.setLooping(true);
                play();


            }
        });
    }
    public void play(){
        int duration = mediaPlayer.getDuration();//获取视频的时间长度
        seekBar.setMax(duration);//设置seek的max为视频播放的长度.
        mediaPlayer.start();
        Message message = new Message();
        message.arg1 = time;
        handler.sendMessage(message);
        isPlaying = true;
    }

    private void initView() {
        videoSurfaceView = findViewById(R.id.vidosv);
        findViewById(R.id.startbtn).setOnClickListener(this);
        findViewById(R.id.stopbtn).setOnClickListener(this);

        surfaceHolder = videoSurfaceView.getHolder();
        surfaceHolder.addCallback(this);

        seekBar = findViewById(R.id.sb);
        seekBar.setOnSeekBarChangeListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.startbtn:

                mediaPlayer.start(); //重新播放
                isPause = false;
                if(isPlaying==true){
                    play();
                }


                break;
            case R.id.stopbtn:
                //如果正在播放
                    mediaPlayer.pause();//暂停
                    isPause = true;
                break;
                default:
                    break;
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        mediaPlayer.setDisplay(holder);//设置让surfaceview来播放视频.
        mediaPlayer.prepareAsync();//异步准备.
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (isPlaying) {
            mediaPlayer.stop();//停止播放
            mediaPlayer.release(); //释放资源
        }

    }

    //进度条改变的进度
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

    }

    //开始拖动
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    //停止拖动
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
         mediaPlayer.seekTo(seekBar.getProgress());//调整mediaplayer的播放进度
        handler.removeCallbacksAndMessages(null);//删除所有handler的信息.
        Message message = new Message();
        time = (seekBar.getProgress() / 1000);
        handler.sendMessage(message);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);//防止内存泄漏
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值