顾小林 2012-12-12 05:06 采纳率: 60%
浏览 9124
已采纳

android 可旋转控件

我试过 在ondraw 里面 用 canvas.rotate 方法
然后自己写一个 setOrientation方法 调用 ondraw方法 但是刷新时间 还有效果 都不是很好。谁能给一个 android 自定义 可旋转的控件 可以动态旋转 的那种。

  • 写回答

2条回答 默认 最新

  • 鄙人姓胡 2012-12-14 08:16
    关注

    我以前写过一个旋转按钮控件,是用区间进行判断的,你可以借鉴一下:

    enter code hpackage 
    

    jxt.app.radio.view;

    import jxt.app.radio.R;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.PaintFlagsDrawFilter;
    import android.graphics.RectF;
    import android.util.AttributeSet;
    import android.view.ViewGroup;

    public class FMView extends ViewGroup {

    public float fRotateNum;
    float fCenterX,fCenterY;
    private int iPic = R.drawable.switch_fm_s1;
    
    public FMView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public FMView(Context context) {
        super(context);
    }
    
    
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
    
    }
    
    
    protected void onDraw(Canvas canvas) {
    

    // super.onDraw(canvas);
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), iPic);

        RectF target = new RectF();
        target.left = 0;
        target.top = 0;
        target.right = bitmap.getWidth();
        target.bottom = bitmap.getHeight();
        fCenterX = (int) (target.right/2.0);
        fCenterY = (int) (target.bottom/2.0);
        canvas.save();
        canvas.rotate(fRotateNum, fCenterX, fCenterY);
        canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
        canvas.drawBitmap(bitmap, null, target, null);
        canvas.restore();
        bitmap.recycle();
    }
    
    public float getfRotateNum() {
        return fRotateNum;
    }
    
    public void setfRotateNum(float fRotateNum) {
        this.fRotateNum = fRotateNum;
    }
    
    public float getfCenterX() {
        return fCenterX;
    }
    
    public void setfCenterX(float fCenterX) {
        this.fCenterX = fCenterX;
    }
    
    public float getfCenterY() {
        return fCenterY;
    }
    
    public void setfCenterY(float fCenterY) {
        this.fCenterY = fCenterY;
    }
    

    }
    ere

    触发这个控件的旋转:

        private float fFirstX,fFirstY,fCenterX,fCenterY,fSecondX,fSecondY;
    private float fLastRotateFM,fRotateFM,fRotateVoice;
    
    public boolean onTouch(View view, MotionEvent event) {
        if(view.getId() == R.id.image_pinlv){
            hideRecordLayout();
            if(bRecording == true){
                showRecordDialog();
            }else{
                switch(event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    fCenterX = mFMView.getfCenterX();
                    fCenterY = mFMView.getfCenterY();
                    fFirstX = event.getX();
                    fFirstY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    if(fFirstX != fCenterX){
                        fFirstAngle = (float) Math.toDegrees(Math.atan(Math.abs(fFirstY-fCenterY)/Math.abs(fFirstX-fCenterX)));
                    }
                    fSecondX = event.getX();
                    fSecondY = event.getY();
                    if(fSecondX != fCenterX){
                        fSecondAngle = (float) Math.toDegrees(Math.atan(Math.abs(fSecondY-fCenterY)/Math.abs(fSecondX-fCenterX)));
                    }
                    if(fFirstX >= fCenterX && fFirstY <= fCenterY){     //在第一区间,即右上角
                        fRotateFM += fFirstAngle - fSecondAngle;
                    }else if(fFirstX < fCenterX && fFirstY <= fCenterY){  //在第二区间,即左上角
                        fRotateFM += fSecondAngle - fFirstAngle;
                    }else if(fFirstX < fCenterX && fFirstY > fCenterY){  //在第三区间,即左下角
                        fRotateFM += fFirstAngle - fSecondAngle;
                    }else if(fFirstX > fCenterX && fFirstY > fCenterY){  //在第四区间,即右下角
                        fRotateFM += fSecondAngle - fFirstAngle;
                    }
                    if(fRotateFM != 0){
                        mFMView.setfRotateNum(fRotateFM);
                        mFMView.invalidate();
                    }
                    fFirstX = fSecondX;
                    fFirstY = fSecondY;
                    break;
                case MotionEvent.ACTION_UP:
                    if(fRotateFM - fLastRotateFM > 0){
                        //往右旋转
                    }else{
                        //往左旋转
                    }
                    break;
                }
            }
        }
        return true;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站