Membuat Panorama 360 Viewer DI Android Studio. |
Oke, langsung aja bikin project baru di android studio, File > New > New Project trus di sesuaikan deh nama packages dan pilih template Blank Activity kalo dikasih pilihan.
Oiyaa, nnti hasilnya pake Fragment bukan Activity, tapi disesuain aja kebutuhannya. Pertama tama kita buka file "build.gradle" dulu, kita rubah sedikit, tambahin kode ini nih di di dependencies :
compile 'com.google.vr:sdk-audio:1.10.0' compile 'com.google.vr:sdk-base:1.10.0' compile 'com.google.vr:sdk-common:1.10.0' compile 'com.google.vr:sdk-commonwidget:1.10.0' compile 'com.google.vr:sdk-panowidget:1.10.0' compile 'com.google.vr:sdk-videowidget:1.10.0'
Nanti kira kira jadinya begini nih :
dependencies { compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' compile 'com.google.vr:sdk-audio:1.10.0' compile 'com.google.vr:sdk-base:1.10.0' compile 'com.google.vr:sdk-common:1.10.0' compile 'com.google.vr:sdk-commonwidget:1.10.0' compile 'com.google.vr:sdk-panowidget:1.10.0' compile 'com.google.vr:sdk-videowidget:1.10.0' }Nah klo udah, kita buka file AndroidManifest.xml, kita isi file ini dengan full code dibawah ini :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.devrel.vrviewapp"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Nah lanjut nih yaa, masi ada banyak soalnya :D "Ojo Kendor Bruhh".. Kalo udah ada file MainActivity.java silahkan dibuka dan klo belum ada silahkan dibuat dan copy & paste kode dibawah :
package com.google.devrel.vrviewapp; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); assert tabLayout != null; tabLayout.addTab(tabLayout.newTab().setText(R.string.welcome)); tabLayout.addTab(tabLayout.newTab().setText(R.string.venue)); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); final PagerAdapter adapter = new FragmentStatePagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { switch (position) { case 0: return new WelcomeFragment(); case 1: return new GorillaFragment(); } return null; } @Override public int getCount() { return 2; } }; assert viewPager != null; viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } }File MainActivity.java membutuhkan file activity_main.xml & dan copy paste kode dibawah ini :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/main_layout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:background="?attr/colorPrimary" android:elevation="6dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/toolbar" android:background="?attr/colorPrimary" android:elevation="6dp" android:minHeight="?attr/actionBarSize" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_below="@id/tab_layout"/> </RelativeLayout>Okeehh udah di copas kan..?? lanjutt kita membuat 2 buah file Fragment bernama WelcomeFragment.java & GorillaFragment.java. Untuk isi file WelcomeFragment.java, Copy paste aja langsung potongan full kode dibawah ini :
package com.google.devrel.vrviewapp; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.google.vr.sdk.widgets.pano.VrPanoramaView; /** * Fragment for handling the Welcome tab. */ public class WelcomeFragment extends Fragment { private VrPanoramaView panoWidgetView; private ImageLoaderTask backgroundImageLoaderTask; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.welcome_fragment, container,false); panoWidgetView = (VrPanoramaView) v.findViewById(R.id.pano_view); return v; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); loadPanoImage(); } @Override public void onPause() { panoWidgetView.pauseRendering(); super.onPause(); } @Override public void onResume() { panoWidgetView.resumeRendering(); super.onResume(); } @Override public void onDestroy() { // Destroy the widget and free memory. panoWidgetView.shutdown(); super.onDestroy(); } private synchronized void loadPanoImage() { ImageLoaderTask task = backgroundImageLoaderTask; if (task != null && !task.isCancelled()) { // Cancel any task from a previous loading. task.cancel(true); } // pass in the name of the image to load from assets. VrPanoramaView.Options viewOptions = new VrPanoramaView.Options(); viewOptions.inputType = VrPanoramaView.Options.TYPE_MONO; // use the name of the image in the assets/ directory. String panoImageName = "panorama.jpg"; // create the task passing the widget view and call execute to start. task = new ImageLoaderTask(panoWidgetView, viewOptions, panoImageName); task.execute(getActivity().getAssets()); backgroundImageLoaderTask = task; } }Nah di file WelcomeFragment.java kita membutuhkan extend function class biar code mudah dibaca, nama function'nya yaitu ImageLoaderTask, file ini gunanya untuk rendering image panorama 360 secara running background, biar gak terlalu membebani proses dari Current Activity ;) Copy Paste langsung, GPL !!! heheh..
package com.google.devrel.vrviewapp; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log; import com.google.vr.sdk.widgets.pano.VrPanoramaView; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; /** * Created by webster on 1/23/17. */ public class ImageLoaderTask extends AsyncTaskOiyaa hampir lupa buat file view dari WelcomeFragment, ini nama filenya welcome_fragment.xml copas langsung bruhhh ;){ private static final String TAG = "ImageLoaderTask"; private final String assetName; private final WeakReference viewReference; private final VrPanoramaView.Options viewOptions; private static WeakReference lastBitmap = new WeakReference<>(null); private static String lastName; public ImageLoaderTask(VrPanoramaView view, VrPanoramaView.Options viewOptions, String assetName) { viewReference = new WeakReference<>(view); this.viewOptions = viewOptions; this.assetName = assetName; } @Override protected Bitmap doInBackground(AssetManager... params) { AssetManager assetManager = params[0]; if (assetName.equals(lastName) && lastBitmap.get() != null) { return lastBitmap.get(); } try(InputStream istr = assetManager.open(assetName)) { Bitmap b = BitmapFactory.decodeStream(istr); lastBitmap = new WeakReference<>(b); lastName = assetName; return b; } catch (IOException e) { Log.e(TAG, "Could not decode default bitmap: " + e); return null; } } @Override protected void onPostExecute(Bitmap bitmap) { final VrPanoramaView vw = viewReference.get(); if (vw != null && bitmap != null) { vw.loadImageFromBitmap(bitmap, viewOptions); } } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/welcome_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/activity_horizontal_margin" android:layout_weight="1" android:text="@string/welcome_title" android:textAlignment="center" android:textAppearance="?android:attr/textAppearanceLarge"/> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="12" android:id="@+id/codelabview" android:layout_marginStart="@dimen/activity_horizontal_margin" android:src="@drawable/codelab" android:contentDescription="@string/codelab_img_description" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginStart="@dimen/activity_horizontal_margin" android:text="@string/welcome_description"/> <com.google.vr.sdk.widgets.pano.VrPanoramaView android:id="@+id/pano_view" android:layout_weight="5" android:layout_height="0dp" android:layout_margin="5dip" android:layout_width="match_parent" android:scrollbars="none" android:contentDescription="@string/codelab_img_description"/> </LinearLayout>File yang selanjutnya yaitu GorillaFragment.java, copas aja langsung ;)
package com.google.devrel.vrviewapp; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * Fragment for the Gorilla tab. */ public class GorillaFragment extends Fragment { private static final String TAG = "GorillaFragment"; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.gorilla_fragment, container,false); } }Dan bikin juga file View buat GorillaFragment, ini nama file'nya gorrila_fragment.xml ini langsung telen aja, ehh sorry di copas yaa gan :D
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:orientation="vertical" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/gorilla_info" android:layout_marginTop="@dimen/activity_vertical_margin" android:layout_marginStart="@dimen/activity_horizontal_margin" android:layout_marginBottom="@dimen/activity_vertical_margin" android:id="@+id/textView" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/gorillaView" android:layout_marginStart="@dimen/activity_horizontal_margin" android:layout_marginTop="@dimen/activity_vertical_margin" android:src="@drawable/gorilla" /> </LinearLayout> </ScrollView>
Dan ini hasil dari semua yang sudah kita perbuat :D
Okeh mari kita sudahi saja sharing kali ini, semoga mudah dipahami dan dimengerti, dan jangan lupa kabarin kalo jalan :D . Klo ada yang kurang jelas bisa ditanyakan di komentar yang ada dibawah, sampai ketemu lagi dalem episode selanjutnya, dan salam olahraga.
Link project fo ya learn ;) https://github.com/13yewebster/Android-Panorama-360-Viewer
No comments:
Post a Comment