هنگام افزودن یک پیشنمایش به برنامه خود، از PreviewView
استفاده کنید، که یک View
است که میتواند برای نمایش مناسب برش داده شود، مقیاسبندی شود و بچرخد.
هنگامی که دوربین فعال می شود، پیش نمایش تصویر به سطحی در داخل PreviewView
پخش می شود.
از PreviewView استفاده کنید
پیاده سازی پیش نمایش برای CameraX با استفاده از PreviewView
شامل مراحل زیر است که در بخش های بعدی پوشش داده می شود:
- به صورت اختیاری یک
CameraXConfig.Provider
را پیکربندی کنید. - یک
PreviewView
به طرح بندی خود اضافه کنید. - درخواست
ProcessCameraProvider
. - هنگام ایجاد
View
،ProcessCameraProvider
را بررسی کنید. - یک دوربین انتخاب کنید و چرخه عمر و موارد استفاده را ببندید.
استفاده از PreviewView
محدودیت هایی دارد. هنگام استفاده از PreviewView
، نمی توانید هیچ یک از کارهای زیر را انجام دهید:
- یک
SurfaceTexture
برای تنظیم رویTextureView
وPreview.SurfaceProvider
ایجاد کنید. -
SurfaceTexture
ازTextureView
بازیابی کنید و آن را رویPreview.SurfaceProvider
تنظیم کنید. -
Surface
ازSurfaceView
دریافت کنید و آن را رویPreview.SurfaceProvider
تنظیم کنید.
اگر هر یک از این موارد اتفاق افتاد، Preview
جریان فریمها را به PreviewView
متوقف میکند.
یک نمای پیش نمایش به طرح بندی خود اضافه کنید
نمونه زیر یک PreviewView
در یک طرح نشان می دهد:
<FrameLayout android:id="@+id/container"> <androidx.camera.view.PreviewView android:id="@+id/previewView" /> </FrameLayout>
درخواست ارائه دهنده دوربین
کد زیر نحوه درخواست CameraProvider
را نشان می دهد:
کاتلین
import androidx.camera.lifecycle.ProcessCameraProvider import com.google.common.util.concurrent.ListenableFuture class MainActivity : AppCompatActivity() { private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider> override fun onCreate(savedInstanceState: Bundle?) { cameraProviderFuture = ProcessCameraProvider.getInstance(this) } }
جاوا
import androidx.camera.lifecycle.ProcessCameraProvider import com.google.common.util.concurrent.ListenableFuture public class MainActivity extends AppCompatActivity { private ListenableFuture<ProcessCameraProvider> cameraProviderFuture; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { cameraProviderFuture = ProcessCameraProvider.getInstance(this); } }
در دسترس بودن CameraProvider را بررسی کنید
پس از درخواست CameraProvider
، بررسی کنید که هنگام ایجاد نمای، مقداردهی اولیه آن موفقیت آمیز باشد. کد زیر نحوه انجام این کار را نشان می دهد:
کاتلین
cameraProviderFuture.addListener(Runnable { val cameraProvider = cameraProviderFuture.get() bindPreview(cameraProvider) }, ContextCompat.getMainExecutor(this))
جاوا
cameraProviderFuture.addListener(() -> { try { ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); bindPreview(cameraProvider); } catch (ExecutionException | InterruptedException e) { // No errors need to be handled for this Future. // This should never be reached. } }, ContextCompat.getMainExecutor(this));
برای مثالی از تابع bindPreview
استفاده شده در این نمونه، به کد ارائه شده در بخش بعدی مراجعه کنید.
یک دوربین انتخاب کنید و چرخه عمر و موارد استفاده را ببندید
پس از ایجاد و تأیید CameraProvider
، موارد زیر را انجام دهید:
- یک
Preview
ایجاد کنید. - گزینه دوربین مورد نظر
LensFacing
مشخص کنید. - دوربین انتخابی و موارد استفاده را به چرخه عمر متصل کنید.
-
Preview
بهPreviewView
وصل کنید.
کد زیر یک مثال را نشان می دهد:
کاتلین
fun bindPreview(cameraProvider : ProcessCameraProvider) { var preview : Preview = Preview.Builder() .build() var cameraSelector : CameraSelector = CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() preview.setSurfaceProvider(previewView.getSurfaceProvider()) var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview) }
جاوا
void bindPreview(@NonNull ProcessCameraProvider cameraProvider) { Preview preview = new Preview.Builder() .build(); CameraSelector cameraSelector = new CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build(); preview.setSurfaceProvider(previewView.getSurfaceProvider()); Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview); }
توجه داشته باشید که bindToLifecycle()
یک شی Camera
را برمی گرداند. برای اطلاعات بیشتر در مورد کنترل خروجی دوربین، مانند زوم و نوردهی، به خروجی دوربین مراجعه کنید.
اکنون اجرای پیش نمایش دوربین را تمام کرده اید. برنامه خود را بسازید و تأیید کنید که پیش نمایش شما در برنامه شما ظاهر می شود و همانطور که می خواهید عمل می کند.
کنترل های اضافی برای PreviewView
CameraX PreviewView
برخی از API های اضافی را برای پیکربندی ویژگی هایی مانند:
- حالت پیاده سازی برای ارائه جریان های پیش نمایش.
- نوع مقیاس تصویر پیش نمایش
حالت پیاده سازی
PreviewView
میتواند از یکی از حالتهای زیر برای ارائه یک جریان پیشنمایش در View
هدف استفاده کند:
PERFORMANCE
حالت پیش فرض است.PreviewView
ازSurfaceView
برای نمایش جریان ویدیو استفاده می کند، اما در موارد خاص بهTextureView
برمی گردد.SurfaceView
دارای یک سطح طراحی اختصاصی است که شانس بیشتری برای پیادهسازی با پوشش سختافزاری توسط ترکیبکننده سختافزار داخلی دارد، به خصوص زمانی که هیچ عنصر رابط کاربری دیگری (مانند دکمهها) در بالای ویدیوی پیشنمایش وجود ندارد. با رندرینگ با پوشش سختافزاری، فریمهای ویدیو از مسیر GPU جلوگیری میکنند، که میتواند مصرف انرژی پلت فرم و تأخیر را کاهش دهد.حالت
COMPATIBLE
. در این حالت،PreviewView
از یکTextureView
استفاده میکند که برخلافSurfaceView
، سطح طراحی اختصاصی ندارد. در نتیجه، ویدئو با ترکیب رندر می شود تا بتوان آن را نمایش داد. در طول این مرحله اضافی، برنامه میتواند پردازشهای اضافی مانند مقیاسبندی و چرخش ویدیوها را بدون محدودیت انجام دهد.
از PreviewView.setImplementationMode()
برای انتخاب حالت پیاده سازی مناسب برای برنامه خود استفاده کنید. اگر حالت PERFORMANCE
پیش فرض برای برنامه شما مناسب نیست، نمونه کد زیر نحوه تنظیم حالت COMPATIBLE
را نشان می دهد:
کاتلین
// viewFinder is a PreviewView instance viewFinder.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
نوع مقیاس
وقتی وضوح ویدیوی پیشنمایش با ابعاد PreviewView
هدف شما متفاوت است، محتوای ویدیو باید با برش یا جعبه نامه (با حفظ نسبت تصویر اصلی) متناسب با نمایش باشد. PreviewView
ScaleTypes
زیر را برای این منظور فراهم می کند:
FIT_CENTER
،FIT_START
، وFIT_END
برای صندوق پست. محتوای کامل ویدیو به حداکثر اندازه ممکن که می تواند درPreviewView
مورد نظر نمایش داده شود (بالا یا پایین) کوچک شده است. با این حال، اگرچه قاب کامل ویدیو قابل مشاهده است، ممکن است بخشی از صفحه خالی باشد. بسته به اینکه کدام یک از این سه نوع مقیاس را انتخاب می کنید، فریم ویدیو در مرکز، شروع یا انتهای نمای هدف قرار می گیرد.FILL_CENTER
،FILL_START
،FILL_END
برای برش. اگر ویدیویی با نسبت تصویرPreviewView
مطابقت نداشته باشد، فقط بخشی از محتوا قابل مشاهده است، اما ویدیو کلPreviewView
پر می کند.
نوع مقیاس پیشفرض که CameraX استفاده میکند FILL_CENTER
است. از PreviewView.setScaleType()
برای تنظیم مناسب ترین نوع مقیاس برای برنامه خود استفاده کنید. نمونه کد زیر نوع مقیاس FIT_CENTER
را تنظیم می کند:
کاتلین
// viewFinder is a PreviewView instance viewFinder.scaleType = PreviewView.ScaleType.FIT_CENTER
فرآیند نمایش یک ویدیو شامل مراحل زیر است:
- مقیاس ویدیو:
- برای انواع مقیاس
FIT_*
، ویدئو را باmin(dst.width/src.width, dst.height/src.height)
مقیاس کنید. - برای انواع مقیاس
FILL_*
، ویدئو را باmax(dst.width/src.width, dst.height/src.height)
مقیاس کنید.
- برای انواع مقیاس
- ویدیوی مقیاسشده را با
PreviewView
مقصد تراز کنید:- برای
FIT_CENTER/FILL_CENTER
، ویدیوی مقیاسشده وPreviewView
مقصد را در مرکز تراز کنید. - برای
FIT_START/FILL_START
، ویدیوی مقیاسشده وPreviewView
مقصد را با توجه به گوشه سمت چپ بالای هر کدام تراز کنید. - برای
FIT_END/FILL_END
، ویدئوی مقیاسشده وPreviewView
مقصد را با توجه به گوشه سمت راست پایین هر کدام تراز کنید.
- برای
به عنوان مثال، در اینجا یک ویدیوی منبع 640x480 و یک PreviewView
مقصد 1920x1080 وجود دارد:
تصویر زیر فرآیند مقیاسبندی FIT_START
/ FIT_CENTER
/ FIT_END
را نشان میدهد:
فرآیند به این صورت عمل می کند:
- فریم ویدیو را (با حفظ نسبت تصویر اصلی) با
min(1920/640, 1080/480) = 2.25
تغییر دهید تا یک فریم ویدیوی متوسط 1440x1080 بدست آورید. - قاب ویدیویی 1440x1080 را با
PreviewView
1920x1080 تراز کنید.- برای
FIT_CENTER
، قاب ویدیو را با مرکز پنجرهPreviewView
تراز کنید. ستون های 240 پیکسلی شروع و پایانPreviewView
خالی هستند. - برای
FIT_START
، قاب ویدیو را با شروع (گوشه سمت چپ بالا) پنجرهPreviewView
تراز کنید. ستون های انتهایی 480 پیکسلیPreviewView
خالی هستند. - برای
FIT_END
، قاب ویدیو را با انتهای (گوشه سمت راست پایین) پنجرهPreviewView
تراز کنید. ستون های 480 پیکسلی اولیهPreviewView
خالی هستند.
- برای
تصویر زیر فرآیند مقیاسبندی FILL_START
/ FILL_CENTER
/ FILL_END
را نشان میدهد:
فرآیند به این صورت عمل می کند:
- قاب ویدیو را با
max(1920/640, 1080/480) = 3
مقیاس کنید تا یک فریم ویدیوی متوسط 1920x1440 (که بزرگتر از اندازهPreviewView
است) بدست آورید. - قاب ویدیویی 1920x1440 را به تناسب پنجره
PreviewView
1920x1080 برش دهید.- برای
FILL_CENTER
، 1920x1080 را از مرکز ویدیوی با مقیاس 1920x1440 برش دهید. 180 خط بالا و پایین ویدیو قابل مشاهده نیست. - برای
FILL_START
، 1920x1080 را از ابتدای ویدیوی با مقیاس 1920x1440 برش دهید. 360 خط پایین ویدیو قابل مشاهده نیست. - برای
FILL_END
، 1920x1080 را از انتهای ویدیوی با مقیاس 1920x1440 برش دهید. 360 خط برتر ویدیو قابل مشاهده نیست.
- برای
منابع اضافی
برای کسب اطلاعات بیشتر در مورد CameraX، به منابع اضافی زیر مراجعه کنید.