顾小林 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条)

报告相同问题?

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?