2012-04-16 80 views
0

我已经参加了教程here(它动态旋转图像的触摸/飞行)并试图用整个布局而不是仅仅一个图像来重构它,所以我从TutorialActivity改变rotateDialer()方法,像这样:试图在Android中旋转布局,画布看起来不会旋转

private void rotateDialer(float degrees) { 
    //matrix.postRotate(degrees, dialerWidth/2, dialerHeight/2); 
    //dialer.setImageMatrix(matrix); 
    dialer.setNextRotation(degrees, dialerWidth/2, dialerHeight/2); 
    dialer.invalidate(); 
    info.setText("Current Quadrant Touched = "+currentQuadrantTouched 
      +"\nAngle = "+degrees); 
} 

其中拨号器是我与旋转画布在设置然而,许多度重写的onDraw()方法创建一个自定义布局setNextRotation()方法,但画布不会出现旋转!这里是我的自定义布局:

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.drawable.BitmapDrawable; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 

public class DialView extends FrameLayout { 
public static final String LOG_TAG = "DialView"; 
RelativeLayout dialView; 
float degrees; 
float px; 
float py; 

public DialView(Context context) { 
    super(context); 
    init(); 
    // TODO Auto-generated constructor stub 
} 

public DialView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
    // TODO Auto-generated constructor stub 
} 
public DialView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
    init(); 
} 


private void init() 
{ 
    //initialise rotation 
    this.degrees = 0; 
    this.px = 0; 
    this.py = 0; 
    LayoutInflater inflator = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    dialView = (RelativeLayout) inflator.inflate(R.layout.dial_view, this,false); 
    addView(dialView); 
    Log.d(LOG_TAG, "DialView: init() "+ degrees+"degrees around ("+getWidth()/2+","+getHeight()/2+")"); 

} 



public void setNextRotation(float degrees, float px, float py) 
{ 
    this.degrees = degrees; 
    this.px = px; 
    this.py = py; 
    Log.d(LOG_TAG, "Next Rotation = "+ degrees+"degrees around ("+px+","+py+")"); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.save(); 
    // canvas.rotate(45,<appropriate x pivot value>,<appropriate y pivot value>); 
    canvas.rotate(degrees, px, py); 
    Log.d(LOG_TAG, "onDraw: Rotation = "+ degrees+"degrees around ("+px+","+py+")"); 
    super.onDraw(canvas); 
    canvas.restore(); 

} 


} 

这是dial_view.xml:

<ImageView 
    android:id="@+id/topLeftImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginLeft="38dp" 
    android:clickable="true" 
    android:layout_marginTop="28dp" 
    android:src="@drawable/icon" /> 

<ImageView 
    android:id="@+id/topRightImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:clickable="true" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="50dp" 
    android:src="@drawable/icon" /> 

<ImageView 
    android:id="@+id/bottomLeftImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:clickable="true" 
    android:layout_marginBottom="24dp" 
    android:layout_marginLeft="22dp" 
    android:src="@drawable/icon" /> 

<ImageView 
    android:id="@+id/bottomRightImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:clickable="true" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="28dp" 
    android:src="@drawable/icon" /> 

</RelativeLayout> 

为什么在画布上没有明显转动?在计算度数后,我在onTouch()中使拨号程序无效,并且计算工作正常(我正在更改日志中的值),但视图看起来并没有旋转,我在做什么错误?

+0

我知道这是一个旧的帖子,但只花了几个小时就理解这一点:如果你移动canvas.save();在canvas.rotate之前(度,px,py); – Warpzit 2012-06-05 09:15:11

回答

2

好它结果的onDraw()从未被调用的方法,我只是单纯不得不

setWillNotDraw(false) 

添加到我的init()函数和变戏法的的onDraw()方法被调用,我的看法是旋转!

+0

你可以分享代码,这是工作。,Thanx – Udaykiran 2012-08-01 11:46:08

+0

正如我上面所说,我只需要写入“setWillNotDraw(false)”到我的init()函数。如果你将这一行放到你的类的构造函数方法中,那也可以工作。原来的问题本身的代码片段本身可以通过这样做来工作,随意复制它并将该行插入DialView()构造函数或init()函数 – AndroidNoob 2012-08-02 14:28:08

+0

我插入的代码如您所说,但视图仍然存在相同,..不旋转..我也可以看到角度的日志 – Udaykiran 2012-08-02 15:01:07