Android, pomóż obracać obraz na dotyku
Próbuję obrócić jeden z przezroczystych PNGs na tym obrazku. Część liczbowa jest tym, co chcę obrócić. Jestem w stanie to zrobić, ale nie to próbuję osiągnąć
Http://i48.tinypic.com/25exzle.png
Chcę obracać cyfry jak na prawdziwym zamku szyfrowym. Więc użytkownik dotknie i poruszy palcem w okręgu. Przyjrzałem się mniej precyzyjnym obrotom obrazu przy zdarzeniach dotyk/ruch i nie były one wystarczające.To jest obecnie mój kod
public boolean onTouch(View v, MotionEvent event) {
double r=Math.atan2(event.getX()-lockNumbers.getWidth(), lockNumbers.getHeight()-event.getY());
int rotation=(int)Math.toDegrees(r);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
x=event.getX();
y=event.getY();
updateRotation(rotation);
break;
case MotionEvent.ACTION_UP:
break;
}//switch
return true;
}//onTouch
private void updateRotation(double rot){
float newRot=new Float(rot);
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.numbers);
Matrix matrix=new Matrix();
matrix.postRotate(newRot,bitmap.getWidth(),bitmap.getHeight());
if(y>250){
Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
lockNumbers.setImageBitmap(reDrawnBitmap);
}
else{
Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
lockNumbers.setImageBitmap(reDrawnBitmap);
}
}
Zmienia również rozmiar bitmapy po dotknięciu jej ze względu na parametr matrix. Nie jest to pożądany efekt.
Użytkownik będzie musiał iść w kółko palcem.
3 answers
Zapisz poniższy kod w swoim wydarzeniu dotykowym.
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// reset the touched quadrants
for (int i = 0; i < quadrantTouched.length; i++) {
quadrantTouched[i] = false;
}
allowRotating = false;
startAngle = getAngle(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE:
double currentAngle = getAngle(event.getX(), event.getY());
rotateDialer((float) (startAngle - currentAngle));
startAngle = currentAngle;
break;
case MotionEvent.ACTION_UP:
allowRotating = true;
break;
}
// set the touched quadrant to true
quadrantTouched[getQuadrant(event.getX() - (dialerWidth / 2), dialerHeight - event.getY() - (dialerHeight / 2))] = true;
detector.onTouchEvent(event);
return true;
I użyj poniższego linku, aby uzyskać więcej informacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 05:03:30
Akceptując @ Dipak Keshariya ' S odpowiedź kładę sposób, aby uzyskać kąt obrotu, który może pomóc zidentyfikować wybraną część koła.
private float copy[] = new float[9];
matrix.getValues(copy);
float wheelAngle = Math.round(Math.atan2(copy[Matrix.MSKEW_X],
copy[Matrix.MSCALE_X]) * (180 / Math.PI));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:29
Zakładam, że chcesz obrócić obraz w miejscu, w którym użytkownik dotknie ekranu? Jeśli tak, rozszerz SimpleOnGestureListener
Jak w poniższym przykładzie:
public class MyGestureDetector extends SimpleOnGestureListener
{
@Override
public void onLongPress(MotionEvent event)
{
int X = (int)event.getX();
int Y = (int)event.getY();
...Rotate the image
}
}
Gdy już masz współrzędne ekranu zdarzenia dotykowego, możesz zastosować animację obrotu wokół punktu - zobacz tutaj, aby uzyskać więcej szczegółów: http://developer.android.com/guide/topics/graphics/2d-graphics.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-11 00:25:30