我想在 onTouch 函数中启动一个活动,但它只是显示一个空白屏幕。我已经测试了这个活动,它在从主要活动开始时运行。在这里,我想从一个实现 onTouchListener 的类开始这个活动,并使用从 SurfaceView 扩展的自定义视图。
这是我的代码:
package com.example.tutorialfour;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
public class SurfaceViewExample extends Activity implements OnTouchListener{
ourView v;
Bitmap ball;
Bitmap blue;
Bitmap magenta;
Bitmap yellow;
Bitmap green;
Bitmap red;
Bitmap sp;
float x,y;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
try{
v=new ourView(this);
v.setOnTouchListener(this);
ball=BitmapFactory.decodeResource(getResources(), R.drawable.search);
blue=BitmapFactory.decodeResource(getResources(), R.drawable.blue);
magenta=BitmapFactory.decodeResource(getResources(), R.drawable.magenta);
yellow=BitmapFactory.decodeResource(getResources(), R.drawable.yellow);
green=BitmapFactory.decodeResource(getResources(), R.drawable.green);
red=BitmapFactory.decodeResource(getResources(), R.drawable.red);
sp=BitmapFactory.decodeResource(getResources(), R.drawable.spouses);
x=0;
y=0;
setContentView(v);
}catch(Exception e)
{
e.printStackTrace();
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
v.pause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
v.resume();
}
float x1=0;
float y1=0;
float r=100;
float tlx=100; //top left x
float tly=100; //top left y
float trx;
float try1;
float dlx;
float dly;
float drx;
float dry;
float aux; //action up x
float auy;
float cw;
float ch;
int distance;
String predecessor = "Hello world of programming. Hello world of programming";
String successor = "Hello world of programming. Hello world of programming";
String father = "Hello world of programming. Hello world of programming";
String mother = "";
String spouses = "Hello world of programming. Hello world of programming";
int check=0;
Bitmap scaled;
String first="";
String second= "";
String third = "";
boolean pred = true;
boolean succ = true;
boolean fath = true;
boolean moth = true;
boolean spou = true;
float spx=3000;
float spy=3000;
int k=0;
float aspx,aspy;
boolean spGo=false;
boolean spr=true, sps=true,spf=true,spm=true;
Canvas c;
Context context1;
public class ourView extends SurfaceView implements Runnable
{
Thread t=null;
SurfaceHolder holder;
boolean IsItOK=false;
public ourView(Context context) {
super(context);
// TODO Auto-generated constructor stub
context1=context;
holder = getHolder();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(IsItOK=true)
{
if(!holder.getSurface().isValid())
{
continue;
}
c = holder.lockCanvas();
//c.drawBitmap(ball, 0, 0, null);
if(check==0)
{
int canvasWidth = c.getWidth();
int canvasHeight = c.getHeight();
int imageWidth = ball.getWidth();
int imageHeight = ball.getHeight();
float scaleFactor = Math.max( (float)canvasWidth / imageWidth,
(float)canvasHeight / imageHeight );
scaled = Bitmap.createScaledBitmap( ball,
(int)(scaleFactor * imageWidth),
(int)(scaleFactor * imageHeight),
true );
check++;
}
c.drawBitmap(scaled, 0, 0, null);
Paint paint = new Paint();
paint.setTextSize(24);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setAntiAlias(true);
Paint paint1 = new Paint();
paint1.setTextSize(24);
paint1.setStyle(Paint.Style.FILL_AND_STROKE);
paint1.setAntiAlias(true);
//left-top
if(!(predecessor.length()==0))
{
paint.setColor(Color.WHITE);
c.drawBitmap(magenta, x1, y1, null);
//c.drawCircle(x1+r, y1+r, r, paint1);
if(pred==true)
{
adjustText(predecessor);
pred= false;
k++;
}
if(first.length()!=0)
{
c.drawText(first, x1+20, y1+((r/2)+10), paint);
}
if(second.length()!=0)
{
c.drawText(second, x1+3, y1+r, paint);
}
if(third.length()!=0)
{
c.drawText(third, x1+20, y1+(r+(r/2)), paint);
}
}
c.drawBitmap(red, x1+((c.getWidth()/2)-(r+(r/2))), y1+((c.getHeight()/2)-(r+(r/2))), null);
//c.drawCircle(x1+(c.getWidth()/2), y1+(c.getHeight()/2), r+(r/2), new Paint());//center
//down right
if(!(mother.length()==0))
{
paint.setColor(Color.WHITE);
//c.drawCircle(x1+(c.getWidth()-r), y1+(c.getHeight()-r), r, paint1);
c.drawBitmap(green, x1+(c.getWidth()-(r*2)), y1+(c.getHeight()-(r*2)), null);
if(moth==true)
{
adjustText(mother);
moth= false;
k++;
}
if(first.length()!=0)
{
c.drawText(first, (x1+(c.getWidth()-(r*2)))+20, (y1+(c.getHeight()-(r*2))+(r/2)+10), paint);
}
if(second.length()!=0)
{
c.drawText(second, (x1+(c.getWidth()-(r*2)))+3, y1+(c.getHeight()-(r*2))+r, paint);
}
if(third.length()!=0)
{
c.drawText(third, (x1+(c.getWidth()-(r*2)))+20, y1+(c.getHeight()-(r*2))+(r+(r/2)), paint);
}
}
drx = x1+(c.getWidth()-r);
dry = y1+(c.getHeight()-r);
//top right
if(!(successor.length()==0))
{
paint.setColor(Color.WHITE);
c.drawBitmap(yellow, x1+(c.getWidth()-(r*2)), y1, null);
//c.drawCircle(x1+(c.getWidth()-r), y1+r, r, paint1);
if(succ==true)
{
adjustText(successor);
succ= false;
k++;
}
if(first.length()!=0)
{
c.drawText(first, (x1+(c.getWidth()-(r*2)))+20, (y1+(r/2)+10), paint);
}
if(second.length()!=0)
{
c.drawText(second, (x1+(c.getWidth()-(r*2)))+3, y1+r, paint);
}
if(third.length()!=0)
{
c.drawText(third, (x1+(c.getWidth()-(r*2)))+20, y1+(r+(r/2)), paint);
}
}
trx = x1+(c.getWidth()-r);
try1 = y1+r;
//down left
if(!(father.length()==0))
{
paint.setColor(Color.WHITE);
c.drawBitmap(blue, x1, y1+(c.getHeight()-(r*2)), null);
//c.drawCircle(x1+r, y1+(c.getHeight()-r), r, paint1);
if(fath==true)
{
adjustText(father);
fath= false;
k++;
}
if(first.length()!=0)
{
c.drawText(first, x1+20, y1+(c.getHeight()-(r*2))+((r/2)+10), paint);
}
if(second.length()!=0)
{
c.drawText(second, x1+3, y1+(c.getHeight()-(r*2))+r, paint);
}
if(third.length()!=0)
{
c.drawText(third, x1+20, y1+(c.getHeight()-(r*2))+(r+(r/2)), paint);
}
}
dlx = x1+r;
dly=y1+(c.getHeight()-r);
cw= c.getWidth();
ch=c.getHeight();
//Spouses Circle on the front screen if some circle is missing which is identified by k
if(k<=3)
{
if(pred==true)
{
spx=x1;
spy=y1;
spr=false;
}
else if(succ==true)
{
spx=x1+(c.getWidth()-(r*2));
spy=y1;
sps=false;
}
else if(fath==true)
{
spx=x1;
spy=y1+(c.getHeight()-(r*2));
spf=false;
}
else if(moth==true)
{
spx=x1+(c.getWidth()-(r*2));
spy=y1+(c.getHeight()-(r*2));
spm=false;
}
else
{
spx=2000;
spy=2000;
}
if(!(spouses.length()==0))
{
paint.setColor(Color.WHITE);
c.drawBitmap(sp, spx, spy, null);
//c.drawCircle(x1+r, y1+(c.getHeight()-r), r, paint1);
if(spou==true)
{
//adjustText(spouses);
spou= false;
//k++;
}
c.drawText("Show Spouses", spx+20, spy+r+5, paint);
}
}
//Log.e(mother+cw, "\n"+mother+ch);
holder.unlockCanvasAndPost(c);
}
}
public void pause()
{
IsItOK=false;
while(true)
{
try{
t.join();
}catch(InterruptedException e)
{
e.printStackTrace();
}
break;
}
t=null;
}
public void resume()
{
IsItOK=true;
t=new Thread(this);
t.start();
}
}
@Override
public boolean onTouch(View v, MotionEvent me) {
// TODO Auto-generated method stub
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
switch(me.getAction())
{
case MotionEvent.ACTION_UP:
aux=me.getX();
auy=me.getY();
break;
/* case MotionEvent.ACTION_MOVE:
x=me.getX();
y=me.getY();
break;
*/}
if((aux>=0 && aux<=(r*2)) && (auy>=0 && auy<=(r*2)) || spr==false)
{
if(!(tlx==0 || tly==0))
distance = getDistance(tlx,tly);
if(spr==false)
spGo=true;
}
else if((aux>=(cw-(r*2)) && aux<=cw) && (auy>=0 && auy<=(r*2)) || sps==false)
{
if(!(trx==0 || try1==0))
distance = getDistance(trx,try1);
if(sps==false)
spGo=true;
}
else if((aux>=0 && aux<=(r*2)) && (auy>=(ch-(r*2)) && auy<=ch) || spf==false)
{
if(!(dlx==0 || dly==0))
distance = getDistance(dlx,dly);
if(spf==false)
spGo=true;
}
else if((aux>=(cw-(r*2)) && aux<=cw) && (auy>=(ch-(r*2)) && auy<=ch) || spm==false)
{
if(!(drx==0 || dry==0))
distance = getDistance(drx,dry);
if(spm==false)
spGo=true;
}
else
{
}
if(distance>r)
{
}
else if(spGo==true)
{
try{
//v.destroyDrawingCache();
//Log.e(mother+cw, "\n"+mother+ch);
v.clearAnimation();
c.restore();
// Intent first = new Intent("com.example.tutorialfour.DRAWSPOUSES");
// SurfaceViewExample.this.startActivity(first);
Intent myIntent = new Intent("com.example.tutorialfour.DRAWSPOUSES");
//myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
SurfaceViewExample.this.startActivity(myIntent);
}catch(Exception e)
{
e.printStackTrace();
}
}
else
{
DrawingTheBall d = new DrawingTheBall(this);
setContentView(d);
}
return true;
}
public int getDistance(float x2,float y2)
{
distance = (int) Math.sqrt(((aux-x2)*(aux-x2))+((auy-y2)*(auy-y2)));
return distance;
}
public void adjustText(String str)
{
if(str.length()>13)
{
first = str.substring(0, 14);
str = str.substring(14, str.length());
if(str.length()>15)
{
second = str.substring(0, 16);
str = str.substring(16, str.length());
if(str.length()>13)
{
third = str.substring(0, 13);
third+="...";
str = str.substring(13, str.length());
}
else
{
third = str;
}
}
else
{
second = str;
}
}
else
{
first = str;
}
}
}
这是我在 onTouch 函数中使用的代码:
Intent myIntent = new Intent("com.example.tutorialfour.DRAWSPOUSES");
SurfaceViewExample.this.startActivity(myIntent);
请帮助我,我已经尝试了许多互联网上可用的解决方案,但没有一个有效。
更新:这是活动的清单条目:
<activity
android:name="com.example.tutorialfour.drawSpouses"
android:label="@string/app_name"
android:exported="false" >
<intent-filter>
<action android:name="com.example.tutorialfour.DRAWSPOUSES" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
更新:drawSpouses 的代码:
package com.example.tutorialfour;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
public class drawSpouses extends Activity implements OnTouchListener{
spouseView v;
Bitmap sp;
Bitmap ball;
Bitmap red;
float x,y;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
try{
v=new spouseView(this);
v.setOnTouchListener(this);
ball=BitmapFactory.decodeResource(getResources(), R.drawable.search);
sp=BitmapFactory.decodeResource(getResources(), R.drawable.spouses);
red=BitmapFactory.decodeResource(getResources(), R.drawable.red);
x=0;
y=0;
setContentView(v);
}catch(Exception e)
{
e.printStackTrace();
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
v.pause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
v.resume();
}
float x1=0;
float y1=0;
float r=100;
float tlx=100; //top left x
float tly=100; //top left y
float trx;
float try1;
float dlx;
float dly;
float drx;
float dry;
float aux; //action up x
float auy;
float cw;
float ch;
int distance;
String spouses = "Hello world of programming. Hello world of programming";
int check=0;
Bitmap scaled;
String first="";
String second= "";
String third = "";
boolean pred = true;
boolean succ = true;
boolean fath = true;
boolean moth = true;
boolean spou = true;
float spx=3000;
float spy=3000;
int k=0;
String c1="", c2="", c3 ="", c4="";
public class spouseView extends SurfaceView implements Runnable
{
Thread t=null;
SurfaceHolder holder;
boolean IsItOK=false;
public spouseView(Context context) {
super(context);
// TODO Auto-generated constructor stub
holder = getHolder();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(IsItOK=true)
{
if(!holder.getSurface().isValid())
{
continue;
}
Canvas c = holder.lockCanvas();
//c.drawBitmap(ball, 0, 0, null);
if(check==0)
{
int canvasWidth = c.getWidth();
int canvasHeight = c.getHeight();
int imageWidth = ball.getWidth();
int imageHeight = ball.getHeight();
float scaleFactor = Math.max( (float)canvasWidth / imageWidth,
(float)canvasHeight / imageHeight );
scaled = Bitmap.createScaledBitmap( ball,
(int)(scaleFactor * imageWidth),
(int)(scaleFactor * imageHeight),
true );
check++;
}
c.drawBitmap(scaled, 0, 0, null);
Paint paint = new Paint();
paint.setTextSize(24);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setAntiAlias(true);
Paint paint1 = new Paint();
paint1.setTextSize(24);
paint1.setStyle(Paint.Style.FILL_AND_STROKE);
paint1.setAntiAlias(true);
//left-top
if(!(spouses.length()==0))
{
if(spou==true)
{
adjustText(spouses);
spou=false;
}
if(!(c1.length()==0))
{
paint.setColor(Color.WHITE);
c.drawBitmap(sp, x1, y1, null);
//c.drawCircle(x1+r, y1+r, r, paint1);
if(pred==true)
{
divideText(c1);
pred= false;
k++;
}
if(first.length()!=0)
{
c.drawText(first, x1+20, y1+((r/2)+10), paint);
}
if(second.length()!=0)
{
c.drawText(second, x1+3, y1+r, paint);
}
if(third.length()!=0)
{
c.drawText(third, x1+20, y1+(r+(r/2)), paint);
}
}
if(!(c2.length()==0))
{
paint.setColor(Color.WHITE);
c.drawBitmap(sp, x1+(c.getWidth()-(r*2)), y1, null);
//c.drawCircle(x1+(c.getWidth()-r), y1+r, r, paint1);
if(succ==true)
{
divideText(c2);
succ= false;
k++;
}
if(first.length()!=0)
{
c.drawText(first, (x1+(c.getWidth()-(r*2)))+20, (y1+(r/2)+10), paint);
}
if(second.length()!=0)
{
c.drawText(second, (x1+(c.getWidth()-(r*2)))+3, y1+r, paint);
}
if(third.length()!=0)
{
c.drawText(third, (x1+(c.getWidth()-(r*2)))+20, y1+(r+(r/2)), paint);
}
}
if(!(c3.length()==0))
{
paint.setColor(Color.WHITE);
c.drawBitmap(sp, x1, y1+(c.getHeight()-(r*2)), null);
//c.drawCircle(x1+r, y1+(c.getHeight()-r), r, paint1);
if(fath==true)
{
divideText(c3);
fath= false;
k++;
}
if(first.length()!=0)
{
c.drawText(first, x1+20, y1+(c.getHeight()-(r*2))+((r/2)+10), paint);
}
if(second.length()!=0)
{
c.drawText(second, x1+3, y1+(c.getHeight()-(r*2))+r, paint);
}
if(third.length()!=0)
{
c.drawText(third, x1+20, y1+(c.getHeight()-(r*2))+(r+(r/2)), paint);
}
}
if(!(c4.length()==0))
{
paint.setColor(Color.WHITE);
//c.drawCircle(x1+(c.getWidth()-r), y1+(c.getHeight()-r), r, paint1);
c.drawBitmap(sp, x1+(c.getWidth()-(r*2)), y1+(c.getHeight()-(r*2)), null);
if(moth==true)
{
divideText(c4);
moth= false;
k++;
}
if(first.length()!=0)
{
c.drawText(first, (x1+(c.getWidth()-(r*2)))+20, (y1+(c.getHeight()-(r*2))+(r/2)+10), paint);
}
if(second.length()!=0)
{
c.drawText(second, (x1+(c.getWidth()-(r*2)))+3, y1+(c.getHeight()-(r*2))+r, paint);
}
if(third.length()!=0)
{
c.drawText(third, (x1+(c.getWidth()-(r*2)))+20, y1+(c.getHeight()-(r*2))+(r+(r/2)), paint);
}
}
}
c.drawBitmap(red, x1+((c.getWidth()/2)-(r+(r/2))), y1+((c.getHeight()/2)-(r+(r/2))), null);
//c.drawCircle(x1+(c.getWidth()/2), y1+(c.getHeight()/2), r+(r/2), new Paint());//center
//down right
drx = x1+(c.getWidth()-r);
dry = y1+(c.getHeight()-r);
//top right
trx = x1+(c.getWidth()-r);
try1 = y1+r;
//down left
dlx = x1+r;
dly=y1+(c.getHeight()-r);
cw= c.getWidth();
ch=c.getHeight();
holder.unlockCanvasAndPost(c);
}
}
public void pause()
{
IsItOK=false;
while(true)
{
try{
t.join();
}catch(InterruptedException e)
{
e.printStackTrace();
}
break;
}
t=null;
}
public void resume()
{
IsItOK=true;
t=new Thread(this);
t.start();
}
}
@Override
public boolean onTouch(View v, MotionEvent me) {
// TODO Auto-generated method stub
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
switch(me.getAction())
{
case MotionEvent.ACTION_UP:
aux=me.getX();
auy=me.getY();
break;
/* case MotionEvent.ACTION_MOVE:
x=me.getX();
y=me.getY();
break;
*/}
if((aux>=0 && aux<=(r*2)) && (auy>=0 && auy<=(r*2)))
{
if(!(tlx==0 || tly==0))
distance = getDistance(tlx,tly);
}
else if((aux>=(cw-(r*2)) && aux<=cw) && (auy>=0 && auy<=(r*2)))
{
if(!(trx==0 || try1==0))
distance = getDistance(trx,try1);
}
else if((aux>=0 && aux<=(r*2)) && (auy>=(ch-(r*2)) && auy<=ch))
{
if(!(dlx==0 || dly==0))
distance = getDistance(dlx,dly);
}
else if((aux>=(cw-(r*2)) && aux<=cw) && (auy>=(ch-(r*2)) && auy<=ch))
{
if(!(drx==0 || dry==0))
distance = getDistance(drx,dry);
}
else
{
}
if(distance>r)
{
}
else
{
DrawingTheBall d = new DrawingTheBall(this);
setContentView(d);
}
return true;
}
public int getDistance(float x2,float y2)
{
distance = (int) Math.sqrt(((aux-x2)*(aux-x2))+((auy-y2)*(auy-y2)));
return distance;
}
public void adjustText(String str)
{
int ind=0;
if(str.contains("\n"))
{
ind= str.indexOf('\n');
c1= str.substring(0, ind);
str = str.substring(ind+1, str.length());
if(str.contains("\n"))
{
ind= str.indexOf('\n');
c2= str.substring(0, ind);
str = str.substring(ind+1, str.length());
if(str.contains("\n"))
{
ind= str.indexOf('\n');
c3= str.substring(0, ind);
str = str.substring(ind+1, str.length());
if(str.contains("\n"))
{
ind= str.indexOf('\n');
c4= str.substring(0, ind);
str = str.substring(ind+1, str.length());
}
else
{
c4=str;
}
}
else
{
c3=str;
}
}
else
{
c2=str;
}
}
else
{
c1 = str;
}
}
public void divideText(String str)
{
if(str.length()>13)
{
first = str.substring(0, 14);
str = str.substring(14, str.length());
if(str.length()>15)
{
second = str.substring(0, 16);
str = str.substring(16, str.length());
if(str.length()>13)
{
third = str.substring(0, 13);
third+="...";
str = str.substring(13, str.length());
}
else
{
third = str;
}
}
else
{
second = str;
}
}
else
{
first = str;
}
}
}