Android – Erstellen einer kreisförmigen Maske auf Video

Ich bin relativ neu für Android-Entwicklung, und ich frage mich, ob es möglich ist, ein VideoView in eine Form zu maskieren. So habe ich bisher:

erwartetes Ergebnis

Erwartete Ergebnisse (Mockup)

  • Fehler: Interner Fehler: (java.lang.NoSuchMethodError), der alle meine Projekte betrifft
  • Nehmen Sie ein Foto automatisch ohne Benutzerinteraktion auf
  • Ist Java 8 New Date API in Android N verfügbar?
  • Verwenden von LocalBroadcastManager für 'sticky' Sendung
  • Wie dynamisch ändern Sie die Farbe der Fortschritt Bar Hintergrund Android
  • So stellen Sie einen Timer in Android
  • Aktuelle Ergebnisse

    Mein XML für Video-Ansicht und 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> 

    Maskenform 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> 

    Hauptjava:

     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; } } 

  • Kotlin: Wie man mit List-Casts arbeitet: Ungeprüft Darsteller: kotlin.collections.List <Kotlin.Any?> Zu kotlin.colletions.List <Waypoint>
  • Kombinieren von zwei Bitmap-Bildern (nebeneinander)
  • Sdkmanager vs "android update sdk", um Abhängigkeiten zu installieren
  • Algorithmus / Theorie für GPS-Position Jitter Entfernung
  • Android: Benutzerdefinierte Titelleiste
  • Lohnt es sich, ein paar Millisekunden auf ein TextChanged-Ereignis zu warten?
  • 2 Solutions collect form web for “Android – Erstellen einer kreisförmigen Maske auf Video”

    Es ist möglich, ein Video in einen Kreis zu klammern. Was du tun willst, schaffe deine eigene SurfaceView- Klasse und überschreibe dispatchDraw von hier aus kannst du canvas.clipPath anrufen und ein Pfadobjekt übergeben, das den Kreis enthält, in dem das Video maskiert werden soll.

    Hier ist die Ansicht:

     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); } } 

    Hier ist, wie die Aktivität aussehen könnte

     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 } } 

    Ich habe so etwas wie diese Maske gemacht. Sie können bekommen, was Sie wollen, wie folgende Schritte
    1) bereite ein png Bild mit der Form, die du willst und fülle es mit Farbe 0x0000000
    2) verwenden Sie ein leeres Layout und stellen Sie sicher, dass es die VideView abdeckt
    3) jetzt werden alle touchevents von diesem leeren layout erfasst
    4) beurteilen die Punkte der Farben, die in TouchEvent enthalten sind, wenn die Farbe 0x00000000 ist, dann übergeben Sie die Veranstaltung an VideView

    Hier ist ein Beispiel, um einen Punkt Farbe zu bekommen, und es läuft effizient:

     // build a drawingCache and draw the mask layer to the bitmap Bitmap drawingCache = Bitmap.createBitmap(getWidth(), getHeight(),Bitmap.Config.ARGB_4444); Canvas drawingCacheCanvas = new Canvas(drawingCache); drawingCacheCanvas.clipRect(x, y, x + 1, y + 1); draw(drawingCacheCanvas); int color = drawingCache.getPixel(x, y); if (color == getMaskColor()) { //TODO dispatch event to VideoView and let it to handle event } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.