Android的 - 创建一个圆形遮罩视频 [英] Android - Creating a circular mask on video

查看:2622
本文介绍了Android的 - 创建一个圆形遮罩视频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是比较新的Andr​​oid的发展,我想知道是否有可能掩盖VideoView成一字形。这是我到目前为止有:

预期结果

我的XML进行视频观看和布局:

 < RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT
    机器人:后台=#0088ff
    机器人:paddingBottom会=@扪/ activity_vertical_margin
    机器人:以下属性来=@扪/ activity_horizo​​ntal_margin
    机器人:paddingRight =@扪/ activity_horizo​​ntal_margin
    机器人:paddingTop =@扪/ activity_vertical_margin
    工具:上下文=>中VideoPlayerActivity。

    <的FrameLayout
        机器人:layout_width =250dp
        机器人:layout_height =250dp
        机器人:layout_centerHorizo​​ntal =真
        机器人:layout_centerVertical =真
        机器人:背景=@可绘制/ circular_mask
        机器人:前景=@可绘制/ circular_mask>

        < VideoView
            机器人:ID =@ + ID / videoView1
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =FILL_PARENT
            机器人:fitsSystemWindows =假
            机器人:可聚焦=假
            机器人:focusableInTouchMode =假
            机器人:scrollbarAlwaysDrawVerticalTrack =FALSE/>

        <空
            机器人:layout_width =match_parent
            机器人:layout_height =match_parent/>

    < /的FrameLayout>

< / RelativeLayout的>
 

面膜形状的xml:

 <形状的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:填充=20dp
    机器人:形状=椭圆形>

    [固体机器人:颜色=#FFFFFFFF/>

    <边角机器人:半径=10dp/>

< /形状>
 

主要的Java:

 包com.example.webmvideo;

进口android.net.Uri;
进口android.os.Build;
进口android.os.Bundle;
进口android.annotation.TargetApi;
进口android.app.Activity;
进口android.view.Menu;
进口android.widget.MediaController;
进口android.widget.VideoView;
进口android.util.Log;
进口android.media.MediaPlayer;

@TargetApi(Build.VERSION_ codeS.HONEYCOMB)
公共类MainActivity延伸活动{

    乌里中用srcPath = Uri.parse(android.resource://com.example.webmvideo/+ R.raw.test);

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        最后VideoView videoView =(VideoView)
                findViewById(R.id.videoView1);

        videoView.setVideoURI(中用srcPath);

        的MediaController的MediaController =新的MediaController(本);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(的MediaController);

        videoView.setOn preparedListener(新
                MediaPlayer.On preparedListener(){
            @覆盖
            公共无效于prepared(MediaPlayer的MP){
                字符串变量= NULL;
                Log.i(TAG,持续时间=+ videoView.getDuration());
            }
        });
        videoView.start();
    }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        //充气菜单;这增加了项目操作栏,如果它是present。
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }
}
 

解决方案

原来这是可以剪辑视频成一个圆圈。什么你会想要做的就是创建自己的 SurfaceView 类和重写 dispatchDraw 从这里可以致电 canvas.clipPath 并传递一个路径对象,其中包含你想要的视频被蒙面,圆

这里的观点:

 公共类CircleSurface延伸SurfaceView {

    私人路径clipPath;

    公共CircleSurface(上下文的背景下){
        超(上下文);
        在里面();
    }

    公共CircleSurface(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);
        在里面();
    }

    公共CircleSurface(上下文的背景下,ATTRS的AttributeSet,诠释defStyleAttr){
        超(背景下,ATTRS,defStyleAttr);
        在里面();
    }

    私人无效的init(){
        clipPath =新路径();
        // TODO:确定你真正想要的圈子
        clipPath.addCircle(710,330,250,Path.Direction.CW);
    }

    @覆盖
    保护无效dispatchDraw(帆布油画){
        canvas.clipPath(clipPath);
        super.dispatchDraw(画布);
    }
}
 

这里的活动可能是什么样子

 公共类MainActivity扩展活动实现SurfaceHolder.Callback {

    CircleSurface表面;
    MediaPlayer的播放器;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        表面=(CircleSurface)findViewById(R.id.surface);
        SurfaceHolder支架= surface.getHolder();
        holder.addCallback(本);

        球员= MediaPlayer.create(这一点,R.raw.yourvideo);
    }


    @覆盖
    公共无效surfaceCreated(SurfaceHolder持有者){
        player.setDisplay(保持器);
        player.start();
    }

    @覆盖
    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,高度INT){
        // TODO:处理这个问题
    }

    @覆盖
    公共无效surfaceDestroyed(SurfaceHolder持有者){
        // TODO:处理这个问题
    }
}
 

I'm relatively new to Android development, and I was wondering if it's possible to mask a VideoView into a shape. This is what I have so far:

Expected Result

My XML for video view and layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#0088ff"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".VideoPlayerActivity" >

    <FrameLayout
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="@drawable/circular_mask"
        android:foreground="@drawable/circular_mask" >

        <VideoView
            android:id="@+id/videoView1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:fitsSystemWindows="false"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:scrollbarAlwaysDrawVerticalTrack="false" />

        <Space
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </FrameLayout>

</RelativeLayout>

Mask shape xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="20dp"
    android:shape="oval" >

    <solid android:color="#FFFFFFFF" />

    <corners android:radius="10dp" />

</shape>

Main java:

package com.example.webmvideo;

import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.app.Activity;
import android.view.Menu;
import android.widget.MediaController;
import android.widget.VideoView;
import android.util.Log;
import android.media.MediaPlayer;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainActivity extends Activity {

    Uri srcPath = Uri.parse("android.resource://com.example.webmvideo/" + R.raw.test);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final VideoView videoView = (VideoView) 
                findViewById(R.id.videoView1);

        videoView.setVideoURI(srcPath);

        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);

        videoView.setOnPreparedListener(new 
                MediaPlayer.OnPreparedListener()  {
            @Override
            public void onPrepared(MediaPlayer mp) {                         
                String TAG = null;
                Log.i(TAG , "Duration = " + videoView.getDuration());
            }
        });     
        videoView.start();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

解决方案

Turns out it is possible to clip a video into a circle. What you're going to want to do is create your own SurfaceView class and override dispatchDraw from here you can call canvas.clipPath and pass in a Path object that contains the circle you want the video to be masked to.

Here's the view:

public class CircleSurface extends SurfaceView {

    private Path clipPath;

    public CircleSurface(Context context) {
        super(context);
        init();
    }

    public CircleSurface(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircleSurface(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        clipPath = new Path();
        //TODO: define the circle you actually want
        clipPath.addCircle(710, 330, 250, Path.Direction.CW);
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        canvas.clipPath(clipPath);
        super.dispatchDraw(canvas);
    }
}

Here's what the activity might look like

public class MainActivity extends Activity implements SurfaceHolder.Callback {

    CircleSurface surface;
    MediaPlayer player;

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

        surface = (CircleSurface) findViewById(R.id.surface);
        SurfaceHolder holder = surface.getHolder();
        holder.addCallback(this);

        player = MediaPlayer.create(this, R.raw.yourvideo);
    }


    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        player.setDisplay(holder);
        player.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        //TODO: handle this
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //TODO: handle this
    }
}

这篇关于Android的 - 创建一个圆形遮罩视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆