画板以播放器

这篇博客探讨了如何将画板功能与播放器整合,提供丰富的多媒体交互体验。用户可以在画板上自由创作,同时享受音乐或视频播放,增强了艺术创作与娱乐的融合。

画板以播放器

画板

package com.example.work;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    private SurfaceView sfvView;

    private SurfaceHolder holder;
    private Path path = new Path();
    private Button btReset;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        sfvView = findViewById(R.id.sfv_view);
        btReset = findViewById(R.id.bt_reset);
        holder = sfvView.getHolder();
        holder.addCallback(this);

        btReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                path.reset();
            }
        });


        sfvView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                float x = event.getX();
                float y = event.getY();

                if (action == MotionEvent.ACTION_DOWN) {
                    path.moveTo(x, y);
                } else if (action == MotionEvent.ACTION_MOVE) {
                    path.lineTo(x, y);
                }

                return true;
            }
        });
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        new MyThread().start();
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    class MyThread extends Thread {
        @Override
        public void run() {
            Paint paint = new Paint();
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.RED);

            while (true) {
                Canvas canvas = holder.lockCanvas();
                if (canvas == null) {
                    break;
                }
                canvas.drawColor(Color.WHITE);
                canvas.drawPath(path, paint);
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }
}

播放器

package com.example.work.video;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

import com.example.work.R;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public class VideoActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    private SurfaceView sfvVideo;
    private SeekBar seekBar;
    private static final String TAG = "---";
    private SurfaceHolder holder;
    private MediaPlayer mediaPlayer = new MediaPlayer();
    private String url = "http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4";
    private Timer timer;
    private boolean flag = true;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                int duration = mediaPlayer.getDuration();
                int currentPosition = mediaPlayer.getCurrentPosition();

                int values = currentPosition * 100 / duration;
                Log.i(TAG, "handleMessage: "+currentPosition);
                seekBar.setProgress(values);
            }
        }
    };
    private Button btPause;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);
        initView();
    }

    private void initView() {
        sfvVideo = findViewById(R.id.sfv_video);
        seekBar = findViewById(R.id.seek_bar);
        btPause = findViewById(R.id.bt_pause);
        holder = sfvVideo.getHolder();
        holder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holders) {
        mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource(url);
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();

                    mediaPlayer.setDisplay(holder);
                    initSeekBar();
                    myButton();
                    mySeekBar();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void mySeekBar() {
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(fromUser){
                    mediaPlayer.seekTo(progress*mediaPlayer.getDuration()/100);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

    private void myButton() {
        btPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flag){
                    flag = false;
                    mediaPlayer.pause();
                }else{
                    flag = true;
                    mediaPlayer.start();
                }
            }
        });
    }

    private void initSeekBar() {
        seekBar.setMax(100);
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0);
            }
        }, 0, 500);
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mediaPlayer != null) {
            mediaPlayer.release();
        }
        if (timer != null) {
            timer.cancel();
        }
    }

//    class MyThread extends Thread {
//        @Override
//        public void run() {
//
//        }
//    }
}

歌词

package com.example.test;

import android.Manifest;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import com.example.test.bean.MusicBean;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    private static final String TAG = "---";
    private SurfaceView sfvTest;
    private SurfaceHolder holder;
    private String str = "{\"sgc\":false,\"sfy\":false,\"qfy\":false,\"lyricUser\":{\"id\":29418062,\"status\":0,\"demand\":0,\"userid\":12907497,\"nickname\":\"Simfre\",\"uptime\":1441503572343},\"lrc\":{\"version\":5,\"lyric\":\"[by:简单de频率]\\n[00:00.000] 作曲 : 张超\\n[00:01.000] 作词 : 张超\\n[00:22.600]苍茫的天涯是我的爱\\n[00:26.280]绵绵的青山脚下花正开\\n[00:30.130]什么样的节奏是最呀最摇摆\\n[00:33.880]什么样的歌声才是最开怀\\n[00:37.750]弯弯的河水从天上来\\n[00:41.310]流向那万紫千红一片海\\n[00:45.330]火辣辣的歌谣是我们的期待\\n[00:48.880]一路边走边唱才是最自在\\n[00:52.630]我们要唱就要唱得最痛快\\n[00:56.610]你是我天边最美的云彩\\n[01:00.280]让我用心把你留下来(留下来)\\n[01:04.340]悠悠的唱着最炫的民族风\\n[01:07.840]让爱卷走所有的尘埃\\n[01:10.470](我知道)你是我心中最美的云彩\\n[01:15.380]斟满美酒让你留下来(留下来)\\n[01:19.380]永远都唱着最炫的民族风\\n[01:22.760]是整片天空最美的姿态\\n[01:26.700]哟啦啦呵啦呗\\n[01:28.520]伊啦嗦啦呵啦呗呀\\n[01:30.700]我听见你心中动人的天籁\\n[01:34.260]登上天外云霄的舞台\\n[01:37.530]\\n[01:53.250]苍茫的天涯是我的爱\\n[01:56.940]绵绵的青山脚下花正开\\n[02:00.820]什么样的节奏是最呀最摇摆\\n[02:04.570]什么样的歌声才是最开怀\\n[02:08.440]弯弯的河水从天上来\\n[02:12.000]流向那万紫千红一片海\\n[02:15.810]火辣辣的歌谣是我们的期待\\n[02:19.620]一路边走边唱才是最自在\\n[02:23.310]我们要唱就要唱得最痛快\\n[02:27.220]你是我天边最美的云彩\\n[02:30.920]让我用心把你留下来(留下来)\\n[02:34.920]悠悠的唱着最炫的民族风\\n[02:38.410]让爱卷走所有的尘埃\\n[02:41.410](我知道)你是我心中最美的云彩\\n[02:46.210]斟满美酒让你留下来(留下来)\\n[02:50.140]永远都唱着最炫的民族风\\n[02:53.460]是整片天空最美的姿态\\n[02:57.810]\\n[03:18.290]你是我天边最美的云彩\\n[03:21.910]让我用心把你留下来(留下来)\\n[03:26.030]悠悠的唱着最炫的民族风\\n[03:29.510]让爱卷走所有的尘埃\\n[03:32.260](我知道)你是我心中最美的云彩\\n[03:37.010]斟满美酒让你留下来(留下来)\\n[03:41.070]永远都唱着最炫的民族风\\n[03:44.570]是整片天空最美的姿态\\n[03:48.990]\\n[03:50.300]我听见你心中那动人的天籁\\n[03:53.990]就忽如一夜春风袭来满面桃花开\\n[03:57.860]我忍不住去采 我忍不住去摘\\n[04:01.620]我敞开胸怀为你等待\\n[04:04.340]\\n[04:05.840]你是我天边最美的云彩\\n[04:09.280]让我用心把你留下来\\n[04:13.010]悠悠的唱着最炫的民族风\\n[04:16.750]让爱卷走所有的尘埃\\n[04:19.500](我知道)你是我心中最美的云彩\\n[04:24.250]斟满美酒让你留下来(留下来)\\n[04:28.380]永远都唱着最炫的民族风\\n[04:31.750]是整片天空最美的姿态\\n[04:36.190]\\n\"},\"klyric\":{\"version\":0,\"lyric\":null},\"tlyric\":{\"version\":0,\"lyric\":null},\"code\":200}";
    private String lyric = "";
    private String[] permissions = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE
    };
    private int position;
    private List<MusicBean> musicBeanList = new ArrayList<>();
    private MediaPlayer mediaPlayer = new MediaPlayer();
    private Timer timer = new Timer();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            requestPermissions(permissions,123);
        }
        initView();
        myJson();
        myMusic();
        myTimer();
    }

    private void myTimer() {
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                int currentPosition = mediaPlayer.getCurrentPosition();
                for (int i = 0; i < musicBeanList.size(); i++) {
                    if(musicBeanList.get(i).getTime() >= currentPosition){
                        Log.i(TAG, "run: "+position);
                        position = i-1;
                        break;
                    }
                }
            }
        },0,100);
    }

    private void myMusic() {
        if (mediaPlayer != null) {
            mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource("/sdcard/凤凰传奇 - 最炫民族风(Live).mp3");
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        }

    }

    private void myJson() {
        try {
            JSONObject jsonObject = new JSONObject(str);
            JSONObject lrc = jsonObject.getJSONObject("lrc");
            lyric = lrc.getString("lyric");

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

        String[] split = lyric.split("\n");
        for (int i = 0; i < split.length; i++) {
            String[] strings = split[i].split("\\[|:|\\.|]");
            if (strings.length > 4) {
                String minute = strings[1];
                String second = strings[2];
                String millisecond = strings[3];
                String lyric = strings[4];

                int m = Integer.parseInt(minute) * 60 * 1000;
                int s = Integer.parseInt(second) * 1000;
                int ms = Integer.parseInt(millisecond);

                musicBeanList.add(new MusicBean(lyric, (m + s + ms)));

            }
        }
        Log.i(TAG, "myJson: "+musicBeanList.toString());
    }

    private void initView() {
        sfvTest = findViewById(R.id.sfv_test);
        holder = sfvTest.getHolder();
        holder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        new MyThread().start();
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    class MyThread extends Thread{
        @Override
        public void run() {
            Paint paint = new Paint();
            paint.setColor(Color.RED);
            paint.setTextSize(50);
            paint.setAntiAlias(true);

            while (true) {
                Canvas canvas = holder.lockCanvas();
                if (canvas == null) {
                    break;
                }
                canvas.drawColor(Color.WHITE);

                for (int i = 0; i <= position-1; i++) {
                    paint.setColor(Color.GREEN);
                    canvas.drawText(musicBeanList.get(i).getStr_music(),200,500-(position-i)*50,paint);
                }
                paint.setColor(Color.RED);
                canvas.drawText(musicBeanList.get(position).getStr_music(),200,500,paint);

                for(int i = position+1 ; i < musicBeanList.size()-1 ; i ++){
                    paint.setColor(Color.GREEN);
                    canvas.drawText(musicBeanList.get(i).getStr_music(),200,500+(i-position)*100,paint);
                }

                holder.unlockCanvasAndPost(canvas);
            }
        }
    }
}

AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更件进行整体性分析,并为每个件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个件一条)发布到 PR/MR。 在所有件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
内容概要:本介绍了基于物PINN驱动的三维声波波动方程求解(Matlab代码实现)理信息神经网络(PINN)求解三维声波波动方程的Matlab代码实现方法,展示了如何利用PINN技术在无需大量标注数据的情况下,结合物理定律约束进行偏微分方程的数值求解。该方法将神经网络与物理方程深度融合,适用于复杂波动问题的建模与仿真,并提供了完整的Matlab实现方案,便于科研人员理解和复现。此外,档还列举了多个相关科研方向和技术服务内容,涵盖智能优化算法、机器学习、信号处理、电力系统等多个领域,突出其在科研仿真中的广泛应用价值。; 适合人群:具备一定数学建模基础和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事计算物理、声学仿真、偏微分方程数值解等相关领域的研究人员; 使用场景及目标:①学习并掌握PINN在求解三维声波波动方程中的应用原理与实现方式;②拓展至其他物理系统的建模与仿真,如电磁场、热传导、流体力学等问题;③为科研项目提供可复用的代码框架和技术支持参考; 阅读建议:建议读者结合中提供的网盘资源下载完整代码,按照目录顺序逐步学习,重点关注PINN网络结构设计、损失函数构建及物理边界条件的嵌入方法,同时可借鉴其他案例提升综合仿真能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值