Skip to content

Commit

Permalink
Merge pull request #134 from chenchao1407/textviewfix
Browse files Browse the repository at this point in the history
Fix #123 and allow user to set/get refresh frequency of GVRTextViewSceneObject
  • Loading branch information
chenchao1407 committed Jun 18, 2015
2 parents 1f5fbdc + c1cdc1d commit 7fd3c9a
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,32 @@
import android.widget.TextView;

public class GVRTextViewSceneObject extends GVRSceneObject {
private static final int REFRESH_INTERVAL = 30; // frames
private static final int HIGH_REFRESH_INTERVAL = 10; // frames
private static final int MEDIUM_REFRESH_INTERVAL = 20;
private static final int LOW_REFRESH_INTERVAL = 30;

/**
* The refresh frequency of this sceneobject.
*/
public static enum IntervalFrequency {
/*
* Frequency HIGH, means will do refresh every 10 frames
*/
HIGH,
/*
* Frequency MEDIUM, means will do refresh every 20 frames
*/
MEDIUM,
/*
* Frequency LOW, means will do refresh every 30 frames
*/
LOW
}

private static int sReferenceCounter = 0;// This is for load balancing.
private boolean mFirstFrame;
private boolean mIsChanged;
private int mRefreshInterval = MEDIUM_REFRESH_INTERVAL;

private static final int DEFAULT_WIDTH = 2000;
private static final int DEFAULT_HEIGHT = 1000;
Expand Down Expand Up @@ -103,6 +128,9 @@ public GVRTextViewSceneObject(GVRContext gvrContext, GVRMesh mesh,
mSurface = new Surface(mSurfaceTexture);
mSurfaceTexture.setDefaultBufferSize(mTextViewContainer.getWidth(),
mTextViewContainer.getHeight());
sReferenceCounter++;
mCount = sReferenceCounter;
mFirstFrame = true;
}

/**
Expand Down Expand Up @@ -231,6 +259,7 @@ public GVRTextViewSceneObject(GVRContext gvrContext, GVRActivity gvrActivity) {
*/
public void setTextSize(float size) {
mTextView.setTextSize(size);
mIsChanged = true;
}

/**
Expand All @@ -251,6 +280,7 @@ public float getTextSize() {
*/
public void setTextColor(int color) {
mTextView.setTextColor(color);
mIsChanged = true;
}

/**
Expand All @@ -261,6 +291,7 @@ public void setTextColor(int color) {
*/
public void setText(CharSequence text) {
mTextView.setText(text);
mIsChanged = true;
}

/**
Expand Down Expand Up @@ -293,6 +324,7 @@ public String getTextString() {
*/
public void setBackgroundColor(int color) {
mTextViewContainer.setBackgroundColor(color);
mIsChanged = true;
}

/**
Expand All @@ -304,6 +336,7 @@ public void setBackgroundColor(int color) {
*/
public void setBackGround(Drawable drawable) {
mTextViewContainer.setBackground(drawable);
mIsChanged = true;
}

/**
Expand All @@ -324,6 +357,7 @@ public Drawable getBackGround() {
*/
public void setGravity(int gravity) {
mTextView.setGravity(gravity);
mIsChanged = true;
}

/**
Expand All @@ -335,12 +369,56 @@ public int getGravity() {
return mTextView.getGravity();
}

/**
* Set the refresh frequency of this scene object.
*
* @param frequency
* The refresh frequency of this TextViewSceneObject.
*/
public void setRefreshFrequency(IntervalFrequency frequency) {
switch (frequency) {
case HIGH:
mRefreshInterval = HIGH_REFRESH_INTERVAL;
break;
case MEDIUM:
mRefreshInterval = MEDIUM_REFRESH_INTERVAL;
break;
case LOW:
mRefreshInterval = LOW_REFRESH_INTERVAL;
break;
default:
break;
}
}

/**
* Get the refresh frequency of this scene object.
*
* @return The refresh frequency of this TextViewSceneObject.
*/

public IntervalFrequency getRefreshFrequency() {
switch (mRefreshInterval) {
case HIGH_REFRESH_INTERVAL:
return IntervalFrequency.HIGH;
case LOW_REFRESH_INTERVAL:
return IntervalFrequency.LOW;
default:
return IntervalFrequency.MEDIUM;
}
}

private final GVRDrawFrameListener mFrameListener = new GVRDrawFrameListener() {
@Override
public void onDrawFrame(float frameTime) {
if (++mCount > REFRESH_INTERVAL) {
if (mFirstFrame || (++mCount % mRefreshInterval == 0 && mIsChanged)) {
refresh();
mCount = 0;
if (!mFirstFrame) {
mCount = 0;
} else {
mFirstFrame = false;
}
mIsChanged = false;
}
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,52 +15,67 @@

package org.gearvrf.gvrtextviewsample;

import java.util.ArrayList;
import java.util.Random;

import org.gearvrf.GVRContext;
import org.gearvrf.GVRScript;
import org.gearvrf.scene_objects.GVRTextViewSceneObject;
import org.gearvrf.scene_objects.GVRTextViewSceneObject.IntervalFrequency;

import android.graphics.Color;
import android.widget.LinearLayout;

public class SampleViewManager extends GVRScript {

GVRTextViewSceneObject sceneObject;
LinearLayout mTextView;
SampleActivity mActivity;
boolean init = false;
private final String[] strings = new String[] { "good", "verygood",
"veryverygood", "veryverygood", "veryveryverygood" };
private final int[] colors = new int[] { Color.RED, Color.YELLOW,
Color.GREEN, Color.WHITE, Color.MAGENTA };
private final IntervalFrequency[] frequencies = new IntervalFrequency[] {
IntervalFrequency.HIGH, IntervalFrequency.MEDIUM,
IntervalFrequency.LOW };
private float textSize;
private int counter = 0;
Random random = new Random();

ArrayList<GVRTextViewSceneObject> textviews = new ArrayList<GVRTextViewSceneObject>();

SampleViewManager(SampleActivity activity) {
mActivity = activity;
}

@Override
public void onInit(GVRContext gvrContext) {
sceneObject = new GVRTextViewSceneObject(gvrContext, mActivity);
textSize = sceneObject.getTextSize();

// set the scene object position
sceneObject.getTransform().setPosition(0.0f, 0.0f, -2.0f);
for (int i = 0; i < 5; i++) {
sceneObject = new GVRTextViewSceneObject(gvrContext, mActivity);
textSize = sceneObject.getTextSize();

// add the scene object to the scene graph
gvrContext.getNextMainScene().addSceneObject(sceneObject);
// set the scene object position
float x = i * 2.0f;// i * 2.0f - 4.0f;
sceneObject.getTransform().setPosition(x - 4.0f, 0.0f, -2.0f);
sceneObject.setText(strings[i]);
sceneObject.setTextColor(colors[i]);
sceneObject.setTextSize(textSize * (i + 1) / 2);
sceneObject.setRefreshFrequency(frequencies[i % 3]);
// add the scene object to the scene graph
gvrContext.getNextMainScene().addSceneObject(sceneObject);
sceneObject.getTransform().setPositionZ(-3.0f);
textviews.add(sceneObject);
}
}

@Override
public void onStep() {
counter++;
if (counter % 50 == 0) {
int currentState = (counter / 50) % 5;

sceneObject.setText(strings[currentState]);
sceneObject.setTextColor(colors[currentState]);
sceneObject.setTextSize(textSize * (currentState + 1) / 2);
if(counter % 10 == 0){
int viewIndex = random.nextInt(5);
sceneObject = textviews.get(viewIndex);
int colorIndex = random.nextInt(5);
sceneObject.setTextColor(colors[colorIndex]);
}
}

}
}

0 comments on commit 7fd3c9a

Please sign in to comment.