2013-03-22 10 views
16

Mam podgląd kamery w mojej aplikacji na Androida. Jak wszyscy zapewne wiecie, jest on zaimplementowany przez surfaceview w systemie Android.Rozmycie powierzchni ekranu Android używane w aparacie

W mojej aplikacji do zdjęć, która pozwala użytkownikom na robienie zdjęć, chcę rozmazać podgląd kamery (widok powierzchni), jeśli użytkownik jeszcze się nie zalogował, jeśli użytkownik jest zalogowany, wyświetlę zwykły podgląd (bez rozmycia)

rozmycia somthing jak enter image description here

ale wydaje się, że nie da się tego zrobić

kilka rzeczy przychodzą do głowy, ale nie jestem pewien jak to

    osiągnąć
  1. użyj nakładki rozmycia i umieść ją na wierzchu widoku powierzchni, ale w jaki sposób tworzysz taką rozmytą nakładkę?
  2. Innym podejściem jest zmienić atrybut okna, ale nie mogę zrobić, aby surfaceview,

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 
    

więc możemy utworzyć okna nakładki surfaceview i ustawić flagę tak? Nie sądzę więc

może ktoś mi powiedzieć jak rozmycie podgląd z kamery, która jest widok powierzchni

uwaga: Staram się zacierać powierzchnię, która jest ooutput z podglądu kamery, więc jest nie tak, jakbym zacierał statyczny obraz, obszar rozmycia zmieni się w zależności od tego, gdzie jest kamera telefoniczna,

+0

Nie jestem pewien, czy to jest wbudowane, może zajść potrzeba przetworzenia każdej klatki: http://stackoverflow.com/questions/8620560/video-processing-in-android –

+0

Może dodanie przezroczystego obrazu powyżej aparatu surfaceView będzie dla Ciebie łatwiejszym rozwiązaniem? – Devrim

Odpowiedz

2

Najlepszym sposobem na zrobienie tego jest wykonanie zrzutu ekranu kontrolki, zastosowanie do niej rozmycia, a następnie pokaż ten obraz nad oryginalną kontrolką. Tak działa aplikacja pogodowa yahoo i jej sugestia, jak robisz takie rzeczy.

Skrypt Render nie blured szybko. Mam też kod, ale obecnie nie jest on dostępny.

To może pomóc:

http://blog.neteril.org/blog/2013/08/12/blurring-images-on-android http://docs.xamarin.com/recipes/android/other_ux/drawing/blur_an_image_with_renderscript/

Mam również przeczytać, że istnieją metody wbudowane w Androida, które to zrobić, ale API nie jest publiczna, więc nie można go używać ... który jest do bani.

+0

Chociaż myślę, że to zadziałałoby, to wstyd, że został dodany tylko na poziomie API 17, kiedy osobiście potrzebuję go na poziomie interfejsu API 16. – Pete

1

Chociaż druga opcja traci wsparcie w późniejszych wersjach systemu operacyjnego Android, może być dobrym rozwiązaniem. Sądzę, że przyniosę okno Z PRZODU twojego surfaceview i użyj właściwości blur_behind twojego nowego okna W PRZEDNIENIU.

Android API dokumentacja " Stała ta została zaniechana na poziomie API 14. Zacieranie nie jest już obsługiwane Flaga

okno. Rozmycie wszystko za tym oknie

stałą wartość: 4. (0x00000004) "

Muszę przyznać, nie jestem w 100% pewien, że to zadziała, ale zdecydowanie warto spróbować.

+0

Jest to przestarzałe, jak powiedziałeś, jest trochę ryzykowne i szkoda, że ​​żadna alternatywa nie została zaimplementowana z poziomu interfejsu API 14 :(. – Pete

-4

Musisz zmienić parametry kamery; w tym przypadku z Camera.Parameters.setPictureSize().

Podstawowym workflow tutaj jest:

Camera.Parameters cp = mCamera.getParameters(); // get the current params 
cp.set...(); // change something 
mCamera.setParameters(cp); // write the params back 

Upewnij się, że każdy rozdzielczości, które można ustawić za pomocą tej funkcji jest obsługiwany. Możesz uzyskać listę rozdzielczości obsługiwanych na urządzeniu przez Camera.Parameters.getSupportedPictureSizes(). i sprawdź tę dokumentację Camera.

+1

Czy rzeczywiście przeczytałeś pytanie? – Pete

+0

Tak ... Przeczytałem dokładnie, a on otrzymał tę odpowiedź. –