Я работаю над холстом, могу завершить графическую часть циферблата и поместил на него несколько приложений (как в старом телефоне), а теперь я хочу определить, к какой иконке прикоснулся пользователь. Я реализовал этот код для этого в прослушивателе Touch:
public class CanvasDemActivity extends Activity {
Bitmap mLight,mDial,mBrowser,mCamera,mMessage,mDialer,mHome,mLock;
float angle;
ArrayList<Double> mCurrentAngleArray;
ArrayList<PointF> mArray;
ArrayList<Bitmap> mBitmapArray;
PointF p1,p2,p3,p4,p5;
String mTIme;
Date date;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// making it full screen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
Dialer view = new Dialer(this);
setContentView(view);
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if(action == MotionEvent.ACTION_DOWN) {
PointF p = new PointF();
p.x = event.getX(); p.y = event.getY();
for(int i=0;i<5;i++) {
if (p.x >= mArray.get(i).x && p.x < (mArray.get(i).x + mBitmapArray.get(i).getWidth())
&& p.y >= mArray.get(i).y && p.y < (mArray.get(i).y + mBitmapArray.get(i).getHeight())) {
System.out.println("presssed on icon " + i);
break;
}
}
return true;
}
}
public class Dialer extends View{
Context mcontext;
public Dialer(Context context) {
super(context);
mcontext = context;
mLight = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.light);
mDial = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.dial);
mBrowser = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.browser);
mCamera = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.camera);
mMessage = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.message);
mDialer = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.dialer);
mHome = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.home);
mLock = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.lock);
mArray = new ArrayList<PointF>();
mBitmapArray = new ArrayList<Bitmap>();
mCurrentAngleArray = new ArrayList<Double>();
mBitmapArray.add(mBrowser);
mBitmapArray.add(mCamera);
mBitmapArray.add(mMessage);
mBitmapArray.add(mDialer);
mBitmapArray.add(mHome);
date = new Date();
p1 = new PointF();
p1.x = 80.0f ; p1.y = 475;
mArray.add(p1);
p2 = new PointF();
p2.x = 120.0f ; p2.y = 320.0f;
mArray.add(p2);
p3 = new PointF();
p3.x = 260 ; p3.y = 275;
mArray.add(p3);
p4 = new PointF();
p4.x = 315 ; p4.y = 390;
mArray.add(p4);
p5 = new PointF();
p5.x = 330 ; p5.y = 460;
mArray.add(p5);
float delta_x,delta_y;
double mCurrentAngle;
for(int i=0; i<5 ; i++) {
delta_x = mArray.get(i).x - 248;
delta_y = mArray.get(i).y - 430;
mCurrentAngle = Math.atan2(delta_y, delta_x);
mCurrentAngleArray.add(mCurrentAngle);
}
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
canvas.drawPaint(paint);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.WHITE);
paint.setTextSize(75);
if(date.getMinutes() > 9)
mTIme = date.getHours() + ":" + date.getMinutes();
else
mTIme = date.getHours() + ":0" + date.getMinutes();
canvas.drawText(mTIme, 140,125, paint);
String dayNames[] = new DateFormatSymbols().getWeekdays();
Calendar date2 = Calendar.getInstance();
String day = dayNames[date2.get(Calendar.DAY_OF_WEEK)];
java.util.Date d = new java.util.Date(Calendar.getInstance().getTimeInMillis());
String properformat = day+", "+ date.getDate() + " " +new SimpleDateFormat("MMMM").format(d);
paint.setTextSize(25);
canvas.drawText(properformat, 125, 175, paint);
TelephonyManager telephonyManager =((TelephonyManager) mcontext.getSystemService(Context.TELEPHONY_SERVICE));
String operatorName = telephonyManager.getNetworkOperatorName();
if(operatorName.length() == 0 )
operatorName = "Insert Sim Card";
paint.setTextSize(20);
canvas.drawText(operatorName, 175, 210, paint);
canvas.drawBitmap(mDial, canvas.getWidth()/10, canvas.getHeight()/4, null);
canvas.drawBitmap(mLock, canvas.getWidth()/10, canvas.getHeight()/4, null);
for(int i=0;i<5;i++) {
double X = 120 * Math.cos(mCurrentAngleArray.get(i) + angle);
double Y = 120 * Math.sin(mCurrentAngleArray.get(i) + angle);
canvas.drawBitmap(mBitmapArray.get(i),210 + (float) X, 395+ (float)Y, null);
}
angle = angle + 0.01f;
canvas.drawBitmap(mLight, canvas.getWidth()/9,canvas.getHeight()/4f, null);
invalidate();
}
}
}
, где p.x и p.y - это координаты, которых коснулся пользователь, а mArray - это координаты, в которые я поместил растровые изображения, а mBitmapArray - это массив, в котором я сохранил растровое изображение.
Проблема в том, что, несмотря на то, что я правильно написал код, я не могу войти в состояние «если», когда нажимаю значки браузера и номеронабирателя.
Я протестировал тот же код в примере приложения, и он отлично работает.
Подскажите, пожалуйста, в чем проблема?