diff --git a/app/build.gradle b/app/build.gradle index 97a4bcd6..04ef55d0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion '25.0.0' + compileSdkVersion 25 + buildToolsVersion '25.0.3' defaultConfig { - applicationId "com.asha.md360player4android" + applicationId "com.fy.md360player4android" minSdkVersion 15 - targetSdkVersion 22 + targetSdkVersion 25 versionCode 1 versionName "1.0" } @@ -23,7 +23,12 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.2.0' + compile 'net.alhazmy13.MediaPicker:libary:2.3.2' + + compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.1@aar' + compile 'io.reactivex.rxjava2:rxjava:2.0.5' + compile 'com.leon:lfilepickerlibrary:1.2.0' + compile 'com.squareup.picasso:picasso:2.5.2' //required, enough for most devices. compile 'tv.danmaku.ijk.media:ijkplayer-java:0.6.0' diff --git a/app/src/main/java/com/asha/md360player4android/DemoActivity.java b/app/src/main/java/com/asha/md360player4android/DemoActivity.java index ce256021..82f24755 100644 --- a/app/src/main/java/com/asha/md360player4android/DemoActivity.java +++ b/app/src/main/java/com/asha/md360player4android/DemoActivity.java @@ -1,6 +1,8 @@ package com.asha.md360player4android; +import android.Manifest; import android.content.ContentResolver; +import android.content.Intent; import android.content.res.Resources; import android.net.Uri; import android.os.Bundle; @@ -12,6 +14,15 @@ import android.widget.EditText; import android.widget.Toast; +import com.leon.lfilepickerlibrary.LFilePicker; +import com.tbruyelle.rxpermissions2.RxPermissions; + +import java.io.File; +import java.util.List; + +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + /** * Created by hzqiujiadi on 16/1/26. * hzqiujiadi ashqalcn@gmail.com @@ -22,12 +33,16 @@ public class DemoActivity extends AppCompatActivity { //public static final String sPath = "file:////storage/sdcard1/vr/"; + private static final int REQUEST_CODE_CHOOSE = 0; + + private EditText et; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); - final EditText et = (EditText) findViewById(R.id.edit_text_url); + et = (EditText) findViewById(R.id.edit_text_url); SparseArray data = new SparseArray<>(); @@ -105,10 +120,57 @@ public void onClick(View v) { } } }); + + findViewById(R.id.choose_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + RxPermissions rxPermissions = new RxPermissions(DemoActivity.this); + rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(Boolean aBoolean) { + if (aBoolean) { + new LFilePicker() + .withActivity(DemoActivity.this) + .withRequestCode(REQUEST_CODE_CHOOSE) + .start(); + } else { + Toast.makeText(DemoActivity.this, "Permission Denied!", Toast.LENGTH_LONG) + .show(); + } + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + }); } private Uri getDrawableUri(@DrawableRes int resId){ Resources resources = getResources(); return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + resources.getResourcePackageName(resId) + '/' + resources.getResourceTypeName(resId) + '/' + resources.getResourceEntryName(resId) ); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) { + List list = data.getStringArrayListExtra("paths"); + et.setText(Uri.fromFile(new File(list.get(0))).toString()); + } + } } diff --git a/app/src/main/java/com/asha/md360player4android/MD360PlayerActivity.java b/app/src/main/java/com/asha/md360player4android/MD360PlayerActivity.java index d708f8d0..c6ccea41 100644 --- a/app/src/main/java/com/asha/md360player4android/MD360PlayerActivity.java +++ b/app/src/main/java/com/asha/md360player4android/MD360PlayerActivity.java @@ -12,7 +12,9 @@ import android.net.Uri; import android.os.Bundle; import android.support.v4.util.SimpleArrayMap; +import android.util.Log; import android.util.SparseArray; +import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; @@ -63,7 +65,26 @@ public abstract class MD360PlayerActivity extends Activity { private static final SparseArray sPitchFilter = new SparseArray<>(); private static final SparseArray sFlingEnabled = new SparseArray<>(); + private static final SparseArray sControlItems = new SparseArray<>(); + private static final SparseArray sControlType = new SparseArray<>(); + static { + + sControlItems.put(0, "Left"); + sControlItems.put(1, "Right"); + sControlItems.put(2, "Back"); + sControlItems.put(3, "Front"); + + sControlType.put(0, "X"); + sControlType.put(1, "Y"); + sControlType.put(2, "Z"); + sControlType.put(3, "AngleX"); + sControlType.put(4, "AngleY"); + sControlType.put(5, "AngleZ"); + sControlType.put(6, "Pitch(x-axis)"); + sControlType.put(7, "Yaw(y-axis)"); + sControlType.put(8, "Roll(z-axis)"); + sDisplayMode.put(MDVRLibrary.DISPLAY_MODE_NORMAL,"NORMAL"); sDisplayMode.put(MDVRLibrary.DISPLAY_MODE_GLASS,"GLASS"); @@ -151,6 +172,17 @@ public void onCreate(Bundle savedInstanceState) { // init VR Library mVRLibrary = createVRLibrary(); + mVRLibrary.addClickListener(new MDVRLibrary.IGestureListener() { + @Override + public void onClick(MotionEvent e) { + View view = findViewById(R.id.control_layout); + if (view.getVisibility() == View.VISIBLE){ + view.setVisibility(View.GONE); + } else { + view.setVisibility(View.VISIBLE); + } + } + }); final Activity activity = this; @@ -158,37 +190,63 @@ public void onCreate(Bundle savedInstanceState) { hotspotPoints.add(findViewById(R.id.hotspot_point1)); hotspotPoints.add(findViewById(R.id.hotspot_point2)); +// SpinnerHelper.with(this) +// .setData(sDisplayMode) +// .setDefault(mVRLibrary.getDisplayMode()) +// .setClickHandler(new SpinnerHelper.ClickHandler() { +// @Override +// public void onSpinnerClicked(int index, int key, String value) { +// mVRLibrary.switchDisplayMode(MD360PlayerActivity.this, key); +// int i = 0; +// int size = key == MDVRLibrary.DISPLAY_MODE_GLASS ? 2 : 1; +// for (View point : hotspotPoints){ +// point.setVisibility(i < size ? View.VISIBLE : View.GONE); +// i++; +// } +// } +// }) +// .init(R.id.spinner_display); + SpinnerHelper.with(this) - .setData(sDisplayMode) - .setDefault(mVRLibrary.getDisplayMode()) + .setData(sControlType) + .setDefault(0) .setClickHandler(new SpinnerHelper.ClickHandler() { @Override public void onSpinnerClicked(int index, int key, String value) { - mVRLibrary.switchDisplayMode(MD360PlayerActivity.this, key); - int i = 0; - int size = key == MDVRLibrary.DISPLAY_MODE_GLASS ? 2 : 1; - for (View point : hotspotPoints){ - point.setVisibility(i < size ? View.VISIBLE : View.GONE); - i++; - } + controlType = key; } }) .init(R.id.spinner_display); +// +// SpinnerHelper.with(this) +// .setData(sInteractiveMode) +// .setDefault(mVRLibrary.getInteractiveMode()) +// .setClickHandler(new SpinnerHelper.ClickHandler() { +// @Override +// public void onSpinnerClicked(int index, int key, String value) { +// mVRLibrary.switchInteractiveMode(MD360PlayerActivity.this, key); +// } +// }) +// .init(R.id.spinner_interactive); +// + + SpinnerHelper.with(this) - .setData(sInteractiveMode) - .setDefault(mVRLibrary.getInteractiveMode()) + .setData(sControlItems) + .setDefault(0) .setClickHandler(new SpinnerHelper.ClickHandler() { @Override public void onSpinnerClicked(int index, int key, String value) { - mVRLibrary.switchInteractiveMode(MD360PlayerActivity.this, key); + controlItem = key; } }) .init(R.id.spinner_interactive); + SpinnerHelper.with(this) .setData(sProjectionMode) - .setDefault(mVRLibrary.getProjectionMode()) + .setDefault(MDVRLibrary.PROJECTION_MODE_PLANE_FIT) .setClickHandler(new SpinnerHelper.ClickHandler() { @Override public void onSpinnerClicked(int index, int key, String value) { @@ -288,7 +346,7 @@ public void onClick(View v) { .provider(activity, R.drawable.moredoo_logo) .title("front logo") .tag("tag-front") - .position(MDPosition.newInstance().setZ(-12.0f).setY(-1.0f)); + .position(MDPosition.newInstance().setZ(-12.0f).setX(-0.3f)); MDAbsHotspot hotspot = new MDSimpleHotspot(builder); hotspot.rotateToCamera(); plugins.add(hotspot); @@ -307,26 +365,49 @@ public void onClick(View v) { }); findViewById(R.id.button_add_md_view).setOnClickListener(new View.OnClickListener() { + int i = 0; @Override public void onClick(View v) { + if (i >= 4){ + return; + } TextView textView = new TextView(activity); - textView.setBackgroundColor(0x55FFCC11); - textView.setText("Hello world."); - + textView.setTextSize(30); + textView.setTextColor(getResources().getColor(R.color.colorAccent)); MDViewBuilder builder = MDViewBuilder.create() - .provider(textView, 400/*view width*/, 100/*view height*/) - .size(4, 1) - .position(MDPosition.newInstance().setZ(-12.0f)) - .title("md view") - .tag("tag-md-text-view") - ; - + .provider(textView, 1000/*view width*/, 1000/*view height*/) + .size(0.32f * 2f, 0.18f * 2f) + .title("md view"); + if (i == 0) { + textView.setText("left"); + textView.setBackgroundResource(R.drawable.left); + builder.tag("tag_left"); + builder.position(position0); + } else if (i == 1){ + textView.setText("rigth"); + textView.setBackgroundResource(R.drawable.right); + builder.tag("tag_right"); + builder.position(position1); + } else if (i == 2){ + textView.setText("back"); + textView.setBackgroundResource(R.drawable.back); + builder.tag("tag_back"); + builder.position(position2); + } else if (i == 3){ + textView.setText("front"); + textView.setBackgroundResource(R.drawable.front); + builder.tag("tag_front"); + builder.position(position3); + } MDAbsView mdView = new MDView(builder); plugins.add(mdView); getVRLibrary().addPlugin(mdView); + i++; } }); + + findViewById(R.id.button_update_md_view).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -343,24 +424,70 @@ public void onClick(View v) { findViewById(R.id.button_md_view_hover).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - View view = new HoverView(activity); - view.setBackgroundColor(0x55FFCC11); - - MDViewBuilder builder = MDViewBuilder.create() - .provider(view, 300/*view width*/, 200/*view height*/) - .size(3, 2) - .position(MDPosition.newInstance().setZ(-8.0f)) - .title("md view") - .tag("tag-md-text-view") - ; + MDMutablePosition position = null; + if (controlItem == 0) { + position = position0; + } else if (controlItem == 1){ + position = position1; + } else if (controlItem == 2){ + position = position2; + } else if (controlItem == 3){ + position = position3; + } - MDAbsView mdView = new MDView(builder); - mdView.rotateToCamera(); - plugins.add(mdView); - getVRLibrary().addPlugin(mdView); + if (controlType == 0){ + float x = position.getX() + 0.01f; + position.setX(x); + } else if (controlType == 1){ + float y = position.getY() + 0.01f; + position.setY(y); + } else if (controlType == 2){ + float z = position.getZ() + 0.01f; + position.setZ(z); + } else if (controlType == 3){ + float angleX = position.getAngleX() + 1; + position.setAngleX(angleX); + } else if (controlType == 4){ + float angleY = position.getAngleY() + 1; + position.setAngleY(angleY); + } else if (controlType == 5){ + float angleZ = position.getAngleZ() + 1; + position.setAngleZ(angleZ); + } else if (controlType == 6){ + float pitch = position.getPitch() + 1; + position.setPitch(pitch); + } else if (controlType == 7){ + float yaw = position.getYaw() + 1; + position.setYaw(yaw); + } else if (controlType == 8){ + float roll = position.getRoll() + 1; + position.setRoll(roll); + } + Log.e(TAG, "cur pos " + position.toString()); } }); +// findViewById(R.id.button_md_view_hover).setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// View view = new HoverView(activity); +// view.setBackgroundColor(0x55FFCC11); +// +// MDViewBuilder builder = MDViewBuilder.create() +// .provider(view, 300/*view width*/, 200/*view height*/) +// .size(3, 2) +// .position(MDPosition.newInstance().setZ(-8.0f).setX(-0.2f)) +// .title("md view") +// .tag("tag-md-text-view") +// ; +// +// MDAbsView mdView = new MDView(builder); +// mdView.rotateToCamera(); +// plugins.add(mdView); +// getVRLibrary().addPlugin(mdView); +// } +// }); + final TextView hotspotText = (TextView) findViewById(R.id.hotspot_text); final TextView directorBriefText = (TextView) findViewById(R.id.director_brief_text); getVRLibrary().setEyePickChangedListener(new MDVRLibrary.IEyePickListener() { @@ -378,19 +505,68 @@ public void onHotspotHit(IMDHotspot hotspot, long hitTimestamp) { } }); +// findViewById(R.id.button_camera_little_planet).setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// MDDirectorCamUpdate cameraUpdate = getVRLibrary().updateCamera(); +// PropertyValuesHolder near = ofFloat("near", cameraUpdate.getNearScale(), -0.5f); +// PropertyValuesHolder eyeZ = PropertyValuesHolder.ofFloat("eyeZ", cameraUpdate.getEyeZ(), 30f); +// PropertyValuesHolder pitch = PropertyValuesHolder.ofFloat("pitch", cameraUpdate.getPitch(), 90f); +// PropertyValuesHolder yaw = PropertyValuesHolder.ofFloat("yaw", cameraUpdate.getYaw(), 90f); +// PropertyValuesHolder roll = PropertyValuesHolder.ofFloat("roll", cameraUpdate.getRoll(), 0f); +// startCameraAnimation(cameraUpdate, near, eyeZ, pitch, yaw, roll); +// } +// }); + + findViewById(R.id.button_camera_little_planet).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - MDDirectorCamUpdate cameraUpdate = getVRLibrary().updateCamera(); - PropertyValuesHolder near = ofFloat("near", cameraUpdate.getNearScale(), -0.5f); - PropertyValuesHolder eyeZ = PropertyValuesHolder.ofFloat("eyeZ", cameraUpdate.getEyeZ(), 18f); - PropertyValuesHolder pitch = PropertyValuesHolder.ofFloat("pitch", cameraUpdate.getPitch(), 90f); - PropertyValuesHolder yaw = PropertyValuesHolder.ofFloat("yaw", cameraUpdate.getYaw(), 90f); - PropertyValuesHolder roll = PropertyValuesHolder.ofFloat("roll", cameraUpdate.getRoll(), 0f); - startCameraAnimation(cameraUpdate, near, eyeZ, pitch, yaw, roll); + MDMutablePosition position = null; + if (controlItem == 0) { + position = position0; + } else if (controlItem == 1){ + position = position1; + } else if (controlItem == 2){ + position = position2; + } else if (controlItem == 3){ + position = position3; + } + + if (controlType == 0){ + float x = position.getX() - 0.01f; + position.setX(x); + } else if (controlType == 1){ + float y = position.getY() - 0.01f; + position.setY(y); + } else if (controlType == 2){ + float z = position.getZ() - 0.01f; + position.setZ(z); + } else if (controlType == 3){ + float angleX = position.getAngleX() - 1; + position.setAngleX(angleX); + } else if (controlType == 4){ + float angleY = position.getAngleY() - 1; + position.setAngleY(angleY); + } else if (controlType == 5){ + float angleZ = position.getAngleZ() - 1; + position.setAngleZ(angleZ); + } else if (controlType == 6){ + float pitch = position.getPitch() - 1; + position.setPitch(pitch); + } else if (controlType == 7){ + float yaw = position.getYaw() - 1; + position.setYaw(yaw); + } else if (controlType == 8){ + float roll = position.getRoll() - 1; + position.setRoll(roll); + } + Log.e(TAG, "cur pos " + position.toString()); } }); + + findViewById(R.id.button_camera_to_normal).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -465,6 +641,17 @@ public void onAnimationUpdate(ValueAnimator animation) { animator.start(); } + private int controlItem = 0; + + private MDMutablePosition position0 = MDPosition.newInstance().setZ(-2.0f).setX(0.05f).setY(0.17f); + private MDMutablePosition position1 = MDPosition.newInstance().setZ(-2.0f).setX(-0.02f).setY(-0.16f); + private MDMutablePosition position2 = MDPosition.newInstance().setZ(-2.0f).setX(-0.38f).setY(0.02f).setRoll(93.0f); + private MDMutablePosition position3 = MDPosition.newInstance().setZ(-2.0f).setX(0.38f).setRoll(-87f); + + + private int controlType = 0; + + abstract protected MDVRLibrary createVRLibrary(); public MDVRLibrary getVRLibrary() { diff --git a/app/src/main/res/drawable-nodpi/back.png b/app/src/main/res/drawable-nodpi/back.png new file mode 100644 index 00000000..f22aabb5 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/back.png differ diff --git a/app/src/main/res/drawable-nodpi/front.png b/app/src/main/res/drawable-nodpi/front.png new file mode 100644 index 00000000..7b4cf25d Binary files /dev/null and b/app/src/main/res/drawable-nodpi/front.png differ diff --git a/app/src/main/res/drawable-nodpi/left.png b/app/src/main/res/drawable-nodpi/left.png new file mode 100644 index 00000000..6c72f3ae Binary files /dev/null and b/app/src/main/res/drawable-nodpi/left.png differ diff --git a/app/src/main/res/drawable-nodpi/right.png b/app/src/main/res/drawable-nodpi/right.png new file mode 100644 index 00000000..e1876ea1 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/right.png differ diff --git a/app/src/main/res/layout/activity_demo.xml b/app/src/main/res/layout/activity_demo.xml index 83d2b450..b872512d 100644 --- a/app/src/main/res/layout/activity_demo.xml +++ b/app/src/main/res/layout/activity_demo.xml @@ -52,4 +52,10 @@ android:layout_height="wrap_content" /> +