热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android自定义videoview仿抖音界面

这篇文章主要为大家详细介绍了Android自定义videoview仿抖音界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android自定义videoview仿抖音界面的具体代码,供大家参考,具体内容如下

1.效果图

和抖音的界面效果一模一样,而且可以自定义,需要什么页面,请自己定义

2.自定义videoview

package com.example.myapplication20;
 
 
import android.content.Context;
import android.util.AttributeSet;
import android.widget.VideoView;
 
 
/**
 * 作者:created by Jarchie
 * 时间:2020/12/7 15:05:57
 * 邮箱:jarchie520@gmail.com
 * 说明:自定义宽高VideoView
 */
public class CusVideoView extends VideoView {
    public CusVideoView(Context context) {
        super(context);
    }
 
    public CusVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    public CusVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
 
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = getDefaultSize(getWidth(), widthMeasureSpec);
        int height = getDefaultSize(getHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);
    }
}

3.xml界面

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
    
 
    
 
 
    
 
        
 
 
    
 
    

4.drawable


    

5.主界面设置地址,注意,本demo使用的是本地的视频文件,文件存储再../res/raw文件夹里面,请自行获取

package com.example.myapplication20;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
 
 
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
 
/**
 * 作者:JArchie
 * 源码参考地址:https://github.com/JArchie/TiktokDemo
 */
 
public class MainActivity extends AppCompatActivity {
    CusVideoView mVideoView;
    private int[] videos = {R.raw.v1, R.raw.v2, R.raw.qi};
    TextView mTitle;
 
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mVideoView = findViewById(R.id.mVideoView);
        mTitle = findViewById(R.id.mTitle);
 
        String url = "android.resource://" + getPackageName() + "/" + videos[1];
        Log.e("TAG", "video_onCreate: " + url);
 
        mVideoView.setVideoURI(Uri.parse(url));
        mTitle.setText("@王燕\n一起来跳支舞吧");
    }
 
 
    @Override
    protected void onStart() {
        super.onStart();
        playVideo();
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseVideo();
    }
 
    //播放
    private void playVideo() {
 
        Log.e("TAG", "play_video");
 
        // View itemView = mRecycler.getChildAt(0);
        final CusVideoView mVideoView = findViewById(R.id.mVideoView);
        final ImageView mPlay = findViewById(R.id.mPlay);
        final ImageView mThumb = findViewById(R.id.mThumb);
        final MediaPlayer[] mMediaPlayer = new MediaPlayer[1];
        mVideoView.start();
 
        mVideoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
            @Override
            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                mMediaPlayer[0] = mp;
                mp.setLooping(true);
                mThumb.animate().alpha(0).setDuration(200).start();
                return false;
            }
        });
 
        //暂停控制
        mPlay.setOnClickListener(new View.OnClickListener() {
            boolean isPlaying = true;
 
            @Override
            public void onClick(View v) {
                if (mVideoView.isPlaying()) {
                    mPlay.animate().alpha(1f).start();
                    mVideoView.pause();
                    isPlaying = false;
                } else {
                    mPlay.animate().alpha(0f).start();
                    mVideoView.start();
                    isPlaying = true;
                }
            }
        });
    }
 
    //释放
    private void releaseVideo() {
 
        Log.e("TAG", "releaseVideo_video");
 
        //  View itemView = mRecycler.getChildAt(index);
        final CusVideoView mVideoView = findViewById(R.id.mVideoView);
        final ImageView mThumb = findViewById(R.id.mThumb);
        final ImageView mPlay = findViewById(R.id.mPlay);
        mVideoView.stopPlayback();
        mThumb.animate().alpha(1).start();
        mPlay.animate().alpha(0f).start();
    }
 
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • Win11 22563右键单击Windows图标还原方法
    有小伙伴安装了Win1122563,发现出现了右键单击任务栏中的Windows图标或Windows键+X将导致explorerexe崩溃,而且一直出现循环启动,这要怎么解 ... [详细]
  • 本文探讨了在使用Selenium进行自动化测试时,由于webdriver对象实例化位置不同而导致浏览器闪退的问题,并提供了详细的代码示例和解决方案。 ... [详细]
  • 本文介绍如何将自定义项目设置为Tomcat的默认访问项目,使得通过IP地址访问时直接展示该自定义项目。提供了三种配置方法:修改项目路径、调整配置文件以及使用WAR包部署。 ... [详细]
  • 本文介绍了如何通过设置背景形状来轻松地为 Android 的 TextView 添加圆形边框。我们将详细讲解 XML 代码的配置,包括圆角、描边和填充等属性。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 离线安装Grafana Cloudera Manager插件并监控CDH集群
    本文详细介绍如何离线安装Cloudera Manager (CM) 插件,并通过Grafana监控CDH集群的健康状况和资源使用情况。该插件利用CM提供的API接口进行数据获取和展示。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
author-avatar
一个人的生活啦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有