OpenGLを用いてView間に直線を引く
開発初心者の初投稿です。よろしくお願い致します。
現在,OpenGLを用いて,2つのImageView間をつなぐ直線を引くプログラムを作成しています。View間に直線を引く方法は分かったのですが,次段階としてViewを動かしてもView間が線でつながっている表現を行いたかったのですが,現状のコードではViewを移動させると,Viewの表示範囲を超えた段階でViewが隠れてしまいます。
下記のコードに対して,問題点をご指摘いただければ幸いです。
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff00ff">
<android.opengl.GLSurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/glview1">
</android.opengl.GLSurfaceView>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/droid1"
android:layout_marginTop="158dp"
android:src="@drawable/ic_launcher"
android:layout_gravity="center" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/droid2"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:src="@drawable/ic_launcher" />
</FrameLayout>
public class ClearActivity extends ActionBarActivity implements View.OnTouchListener {
private GLSurfaceView mGLSurfaceVIew;
private ClearRenderer mClearRenderer;
private ImageView droid1;
private ImageView droid2;
private int droid1_LocalX;
private int droid1_LocalY;
private int droid2_LocalX;
private int droid2_LocalY;
private int screenX;
private int screenY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mClearRenderer = new ClearRenderer();
setContentView(R.layout.activity_clear);
mGLSurfaceVIew = (GLSurfaceView)findViewById(R.id.glview1);
mGLSurfaceVIew.setRenderer(mClearRenderer);
mGLSurfaceVIew.getHolder().setFormat(PixelFormat.TRANSLUCENT);
droid1 = (ImageView)findViewById(R.id.droid1);
droid2 = (ImageView)findViewById(R.id.droid2);
droid1.setOnTouchListener(this);
droid2.setOnTouchListener(this);
}
@Override
protected void onStart() {
super.onStart();
}
@Override
onWindowFocusChanged(boolean hasFocus){
super.onWindowFocusChanged(hasFocus);
/*----------Viewの座標をもとに,直線の視点終点を設定------------*/
setVertex(--------------);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
class ClearRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glEnable(GL10.GL_ALPHA_TEST);
gl.glColor(1.0f, 1.0f, 0.0f, 1.0f);
vertex[0] = 1.0f;
vertex[1] = 0.0f;
vertex[2] = 0.0f;
vertex[3] = 0.0f;
vertex[4] = 0.0f;
vertex[5] = 0.0f;
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,makeFloatBuffer(vertex));
gl.glDrawArrays(GL10.GL_LINE_LOOP,0,2);
}
//Floatバッファの生成
public static FloatBuffer makeFloatBuffer(float[] arr) {
ByteBuffer bb= ByteBuffer.allocateDirect(arr.length * 4);
bb.order(ByteOrder.nativeOrder());
FloatBuffer fb=bb.asFloatBuffer();
fb.put(arr);
fb.position(0);
return fb;
}
public void setVertex(float x1, float y1,float x2, float y2){
vertex[0] = x1;
vertex[1] = y1;
vertex[3] = x2;
vertex[4] = y2;
}
private float[] vertex = new float[6];
}