2010-12-11 31 views
10

Tôi đã học Android được khoảng hai tuần nay (chuyên gia trong as2/3).Android - Xoay một ImageView bằng ngón tay di chuyển các chế độ xem khác xung quanh

tôi đã tạo ra một LinearLayout1, which contains an ImageView` đơn giản, có chứa một png của một bản ghi vinyl (chỉ là một đĩa tròn cơ bản)

Tôi đã thiết lập ImageView này để được luân chuyển khi người dùng kéo một ngón tay vào nó, giống như gãi hồ sơ.

Mã của tôi có vẻ đang hoạt động (không chắc chắn nếu đó là cách tốt nhất nhưng nó hoạt động). Vấn đề là khi ImageView được xoay, nó sẽ đẩy các chế độ xem khác xung quanh. Tôi đã xác định điều này là bởi vì hình ảnh tròn của tôi thực sự là một hình vuông với các góc trong suốt. Đó là các góc đang đẩy các góc nhìn khác xung quanh và làm cho bản ghi đẩy ra khỏi phía bên trái của màn hình nếu tôi có mặt bằng ImageView.

Có một vài nỗ lực để giải quyết trực tuyến này, nhưng không có cách nào trong số chúng có vẻ là những gì tôi cần và một số được bao bọc trong các ví dụ thật mạnh mẽ.

Nếu ai đó có thể làm sáng tỏ những gì tôi có thể làm để giải quyết vấn đề này thật tuyệt vời. Tôi nhận ra một câu trả lời đơn giản có thể không tồn tại, nhưng hãy nhớ tôi là một noob Java và giữ nó đơn giản như bạn có thể! Cảm ơn rất nhiều vì đã giúp đỡ!

cũng nếu có ai có thể cho tôi biết lý do tôi cần trừ 50 khỏi vòng quay để làm cho việc ghi lại di chuyển dưới điểm chính xác mà người dùng chạm vào, điều đó cũng hữu ích! xem điều này trong phương thức updateRotation().

Dưới đây là đánh dấu xml của tôi:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/baseView" 
    android:background="#FFFFFFFF" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <ImageView 
     android:id="@+id/turntable" 
     android:src="@drawable/turntable" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 

</LinearLayout> 

và đây là mã java của tôi:

package com.codingfiend.android.turntable; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.Window; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class Turntable extends Activity 
{ 
    View baseView; 
    ImageView turntable; 
    TextView bottomText; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.main); 

     baseView = (View)findViewById(R.id.baseView); 
     turntable = (ImageView)findViewById(R.id.turntable); 

     turntable.setOnTouchListener(onTableTouched); 
    } 

    public android.view.View.OnTouchListener onTableTouched = new android.view.View.OnTouchListener() 
    { 
     public boolean onTouch(View v, MotionEvent evt) 
     { 
      double r = Math.atan2(evt.getX() - turntable.getWidth()/2, turntable.getHeight()/2 - evt.getY()); 
      int rotation = (int) Math.toDegrees(r); 


      if (evt.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       // 
      } 

      if (evt.getAction() == MotionEvent.ACTION_MOVE) 
      { 
       updateRotation(rotation); 
      } 

      if (evt.getAction() == MotionEvent.ACTION_UP) 
      { 
       // 
      } 

      return true; 
     } 
    }; 

    private void updateRotation(double rot) 
    { 
     float newRot = new Float(rot); 

     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.turntable); 

     Matrix matrix = new Matrix(); 
     matrix.postRotate(newRot - 50); 

     Bitmap redrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
     turntable.setImageBitmap(redrawnBitmap); 
    } 
} 

EDIT

này được chuyển ra được một vấn đề khó chịu. Đã có một cách để xoay một hình ảnh lớn hoặc lớn hơn màn hình mà không bị thu nhỏ để toàn bộ hình ảnh vẫn còn trên màn hình. Tại sao một phần của hình ảnh luân phiên không thể thoát khỏi màn hình? Rất bực bội. Tôi đã cố gắng gói ImageView vào một khung ảnh FrameView, một phần đã giúp ích. Bây giờ tôi có thể thêm các chế độ xem khác sẽ không bị ảnh hưởng, nhưng tôi vẫn không thể có đủ đĩa của mình vì nó không được phép vượt qua viền màn hình khi nó quay. Tôi không hiểu tại sao. Tôi chưa xem xét mở rộng ImageView. Bất kỳ suy nghĩ nào khác vẫn sẽ được đánh giá cao!

+1

+1 Câu hỏi được đặt ra. Chào mừng bạn đến với SO. – wheaties

Trả lời

3

Thực tế là vì bạn cố xoay chế độ xem trong bố cục tuyến tính. Và điều này sẽ gây ra không gian riêng của nó để mở rộng hoặc thu nhỏ.

Ý tưởng 1: thử sử dụng bố cục khung và chế độ xem của bạn xoay trong đó Ý tưởng 2: thử lớp con xem tùy chỉnh và vẽ bàn xoay của bạn trong onDraw. Trong internet tìm kiếm một ví dụ vẽ la bàn để bắt đầu.

+0

Cảm ơn, tôi sẽ thử đề xuất của bạn ngay bây giờ. Hãy quay lại ngay với kết quả. – Ribs

+1

Sử dụng bố cục khung đã giải quyết được một phần vấn đề trong đó giờ đây tôi có thể thêm các chế độ xem khác sẽ không bị ảnh hưởng bởi ImageView quay, nhưng nếu tôi có ImageView xoay trên cạnh màn hình hoặc màn hình rộng như màn hình , hình ảnh vẫn được đẩy xung quanh bởi các góc của nó khi xoay. – Ribs

+0

Sử dụng kết hợp bố cục khung và lớp chế độ xem tùy chỉnh có ghi đè onDraw() hoạt động. Vẫn còn một số hành vi bất ngờ nhưng tôi nghĩ rằng bây giờ không liên quan đến câu hỏi. – Ribs

0

Fix của bạn imageview bởi

imageview.setScaleType(ScaleType.CENTER);

0

đơn giản và rõ ràng, chỉ cần vẽ một vòng tròn vải và thêm hình ảnh của bạn với những hình ảnh vải canvas.The sẽ không có góc. Ngoài ra, sử dụng FrameLayout để đặt một hình ảnh lên trên hình ảnh kia, điều này sẽ giải quyết được sự cố của bạn

Các vấn đề liên quan