问题描述
我是比较新的Android的发展,我想知道是否有可能掩盖VideoView成一字形。这是我到目前为止有:
预期结果
我的XML进行视频观看和布局:
< RelativeLayout的的xmlns:机器人=http://schemas.android.com/apk/res/android
的xmlns:工具=http://schemas.android.com/tools
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:后台=#0088ff
机器人:paddingBottom会=@扪/ activity_vertical_margin
机器人:以下属性来=@扪/ activity_horizontal_margin
机器人:paddingRight =@扪/ activity_horizontal_margin
机器人:paddingTop =@扪/ activity_vertical_margin
工具:上下文=>中VideoPlayerActivity。
<的FrameLayout
机器人:layout_width =250dp
机器人:layout_height =250dp
机器人:layout_centerHorizontal =真
机器人: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:机器人=http://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的 - 创建一个圆形遮罩视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!