8

Tất cả
Tôi muốn xoay hình ảnh ở góc cụ thể như hình dưới đây. Tôi có mã để quay nhưng nó xoay 360 độ nhưng tôi muốn nó chỉ cho độ đặc biệt và có được số lượng được lựa chọn đó là phía trên của quay số.
xoay vòng ở mức độ giới hạn

enter image description here


dưới đây là mã của tôi. Tùy chỉnh của tôi Xem công việc này tốt nhưng hồ của perfomance.

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.PointF; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 

public class MyDialView extends View implements OnGestureListener{ 
    private static Bitmap bimmap; 
    private static Paint paint; 
    private static Rect bounds; 
    private int totalNicks = 100; 
    private int currentNick = 0; 
    private GestureDetector gestureDetector; 
    private float dragStartDeg = Float.NaN; 
    float dialerWidth = 0,dialerHeight = 0; 

    private static Paint createDefaultPaint() { 
     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     paint.setFilterBitmap(true); 
     return paint; 
    } 
    private float xyToDegrees(float x, float y) { 
     float distanceFromCenter = PointF.length((x - 0.5f), (y - 0.5f)); 
     if (distanceFromCenter < 0.1f 
       || distanceFromCenter > 0.5f) { // ignore center and out of bounds events 
      return Float.NaN; 
     } else { 
      return (float) Math.toDegrees(Math.atan2(x - 0.5f, y - 0.5f)); 
     } 
    } 
    public final float getRotationInDegrees() { 
     return (360.0f/totalNicks) * currentNick; 
    } 

    public final void rotate(int nicks) { 
     currentNick = (currentNick + nicks); 
     if (currentNick >= totalNicks) { 
      currentNick %= totalNicks; 
     } else if (currentNick < 0) { 
      currentNick = (totalNicks + currentNick); 
     } 
     Log.e("Current nick", String.valueOf(currentNick)); 
     if((currentNick > 80 || currentNick < 20)){ 
      invalidate(); 
     } 
    } 
    public MyDialView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     bimmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.out_round); 
     paint = createDefaultPaint(); 
     gestureDetector = new GestureDetector(getContext(), this); 
     dialerWidth = bimmap.getWidth() /2.0f; 
     dialerHeight = bimmap.getHeight()/2.0f; 
     bounds = new Rect(); 
    } 



    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.getClipBounds(bounds); 
      canvas.save(Canvas.MATRIX_SAVE_FLAG); 
      //{ 
       canvas.translate(bounds.left, bounds.top); 

       float rotation = getRotationInDegrees(); 
       canvas.rotate(rotation, dialerWidth, dialerHeight); 
       canvas.drawBitmap(bimmap, 0,0,null); 
       //canvas.rotate(- rotation, dialerWidth, dialerHeight); 
      //}  
      canvas.restore(); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (gestureDetector.onTouchEvent(event)) { 
      return true; 
     } else { 
      return super.onTouchEvent(event); 
     } 
    } 
    //Gesture detector methods 
    @Override 
    public boolean onDown(MotionEvent e) { 
     float x = e.getX()/((float) getWidth()); 
     float y = e.getY()/((float) getHeight()); 

     dragStartDeg = xyToDegrees(x, y); 
     //Log.d("deg = " , ""+dragStartDeg); 
     if (! Float.isNaN(dragStartDeg)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 

    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) { 
     if (! Float.isNaN(dragStartDeg)) { 
      float currentDeg = xyToDegrees(e2.getX()/getWidth(), 
        e2.getY()/getHeight()); 

      if (! Float.isNaN(currentDeg)) { 
       float degPerNick = 360.0f/totalNicks; 
       float deltaDeg = dragStartDeg - currentDeg; 

       final int nicks = (int) (Math.signum(deltaDeg) 
         * Math.floor(Math.abs(deltaDeg)/degPerNick)); 

       if (nicks != 0) { 
        dragStartDeg = currentDeg; 
        rotate(nicks); 
       } 
      } 

      return true; 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     return false; 
    } 

} 


Tôi muốn 0-9 theo người dùng lựa chọn & cũng cho phép người sử dụng để xoay 0-9 vòng xoay không hơn.

Tôi cũng kiểm tra mã khác bên dưới.

dialer = (ImageView) findViewById(R.id.imageView_ring); 
     dialer.setOnTouchListener(new MyOnTouchListener()); 
     dialer.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 
       // method called more than once, but the values only need to be initialized one time 
       if (dialerHeight == 0 || dialerWidth == 0) { 
        dialerHeight = dialer.getHeight(); 
        dialerWidth = dialer.getWidth(); 

        // resize 
        Matrix resize = new Matrix(); 
        resize.postScale((float)Math.min(dialerWidth, dialerHeight)/(float)imageOriginal.getWidth(), (float)Math.min(dialerWidth, dialerHeight)/(float)imageOriginal.getHeight()); 
        imageScaled = Bitmap.createBitmap(imageOriginal, 0, 0, imageOriginal.getWidth(), imageOriginal.getHeight(), resize, false); 

        // translate to the image view's center 
        float translateX = dialerWidth/2 - imageScaled.getWidth()/2; 
        float translateY = dialerHeight/2 - imageScaled.getHeight()/2; 
        matrix.postTranslate(translateX, translateY); 

        dialer.setImageBitmap(imageScaled); 
        dialer.setImageMatrix(matrix); 
        Log.e("Rotation degree :"+rotationDegrees, String.valueOf(tickNumber)); 
       } 
      } 
     }); 

int tickNumber = 0; 
    private void rotateDialer(float degrees) { 

     //System.out.println("Rotation Done :: "+rotationDone); 

     // if(!rotationDone) { 

      this.rotationDegrees += degrees; 
      this.rotationDegrees = this.rotationDegrees % 360; 

      tickNumber = (int)this.rotationDegrees*100/360; 
      // It could be negative 
      if (tickNumber > 0) tickNumber = 100 - tickNumber; 


      //this.rotationDegrees = Math.abs(rotationDegrees); 
      this.tickNumber = Math.abs(tickNumber); 

      if(tickNumber < 20 || tickNumber > 80){ 
       Log.e("Rotation degree :"+rotationDegrees, String.valueOf(tickNumber)); 
       matrix.postRotate(degrees, dialerWidth/2, dialerHeight/2); 
       dialer.setImageMatrix(matrix); 
      } 

     // } 
    } 
    /** 
    * @return The angle of the unit circle with the image view's center 
    */ 
    private double getAngle(double xTouch, double yTouch) { 

     double delta_x = xTouch - (dialerWidth) /2; 
     double delta_y = (dialerHeight) /2 - yTouch; 
     double radians = Math.atan2(delta_y, delta_x); 

     double dx = xTouch - dWidth; 
     double dy = (dHeight - ((dialerHeight) /2)) - yTouch; 
     double dRadi = Math.atan2(dy, dx); 
     //Log.e("MY degree", String.valueOf(Math.toDegrees(dRadi))); 
     //return Math.toDegrees(dRadi); 
     return Math.toDegrees(radians); 
    } 



    /** 
    * Simple implementation of an {@link OnTouchListener} for registering the dialer's touch events. 
    */ 
    private class MyOnTouchListener implements OnTouchListener { 

     private double startAngle; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      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 rotationAngleRadians = Math.atan2(event.getX() - (dialer.getWidth()/2),  ((dialer.getHeight()/2) - event.getY())); 
        double angle = (int) Math.toDegrees(rotationAngleRadians); 
        Log.i("gg", "rotaion angle"+angle);*/ 

        double currentAngle = getAngle(event.getX(), event.getY()); 
        //if(currentAngle < 130 || currentAngle < 110){ 
         //Log.e("Start angle :"+startAngle, "Current angle:"+currentAngle); 
         rotateDialer((float) (startAngle - currentAngle)); 
         startAngle = currentAngle; 
        //} 


        //Log.e("MOVE start Degree:"+startAngle, "Current Degree :"+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; 
     } 
    } 
+0

Bạn đã giải quyết được sự cố chưa? Bạn có thể chia sẻ giải pháp của mình không? Cảm ơn. –

Trả lời

2

Tôi không hiểu vấn đề của bạn. Mã dưới đây xoay hình ảnh 48 độ.

ImageView dialer = (ImageView) findViewById(R.id.imageView_ring); 

int degrees = 48; 
Matrix matrix = new Matrix(); 
matrix.setRotate(degrees); 
Bitmap bmpBowRotated = Bitmap.createBitmap(imageOrginal, 0, 0, imageOrginal.getWidth(),imageOrginal.getHeight(), matrix, false); 

dialer.setImageBitmap(bmpBowRotated); 
+0

ya mà tôi biết nhưng mã của tôi làm việc tốt nhưng nó xoay hình ảnh ở 360 độ nhưng tôi muốn di chuyển hình ảnh theo luân chuyển người dùng ở mức độ cụ thể mà thôi. Trong hình ảnh của tôi chỉ xoay hình ảnh 1 đến 10. –

2

Hi Girish có một lớp tên RotateAnimation bằng cách sử dụng lớp này u có thể dễ dàng làm điều đó

 look Example like 

     RotateAnimation r = new RotateAnimation(0f, -90f,200,200); // HERE 
     r.setStartOffset(1000); 
     r.setDuration(1000); 
     r.setFillAfter(true); //HERE 
     animationSet.addAnimation(r); 
+0

kiểm tra câu hỏi này Tôi đã đặt mã của mình. –

0

Tôi muốn lần đầu tiên biết điều gì sẽ có mặt ở đó để triển khai? Liệu nó có cho phép thao tác Evenets không? nếu có thì bạn sẽ xử lý ManipulationStatring và ManipulationDelta Event để xoay phần tử.
Nếu tương tự không phải là trường hợp Thao tác không có sẵn thì bạn có thể thử thuộc tính RenderTransformation với RorateTransform của phần tử là bạn đang làm việc với WPf.

+0

ya tôi muốn thao tác có thể thêm một số mã mẫu? –

0

tôi đã có thể đạt được điều này bằng cách làm vài trong số các tinh chỉnh sau trên mã của bạn

  1. Làm người dùng nhấp chuột chính xác vào mũi tên luôn để có được những góc ban đầu mà tại đó các mũi tên được đặt, trong trường hợp của bạn 90 độ, nếu không trả về false

  2. Cũng lưu góc mà người dùng loại bỏ ngón tay của mình và sử dụng góc độ đó là giá trị ban đầu cho cảm ứng tiếp theo của mình, như thế nào nếu anh đặt mũi tên ở 100 độ đặt vị trí chạm ban đầu của mình để kích hoạt xoay vòng

  3. Bây giờ để kiểm tra câu trả lời, hãy đặt giá trị của bạn là 120 deg từ 0 đến 9, chia góc đó 10, bạn có thể dễ dàng tìm ra những góc đại diện cho giá trị gì và nhận được kết quả của bạn

Cũng chạm chính xác tại 90deg để bắt đầu luân chuyển là rất khó chịu, vì vậy luôn luôn kiểm tra các giá trị đó là bw 90 + 4 và 90- 4 để bắt đầu nhưng luôn sử dụng 90 làm góc bắt đầu Initial position at 0 Moved 60 degree