我试过 在ondraw 里面 用 canvas.rotate 方法
然后自己写一个 setOrientation方法 调用 ondraw方法 但是刷新时间 还有效果 都不是很好。谁能给一个 android 自定义 可旋转的控件 可以动态旋转 的那种。
android 可旋转控件
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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上使用吗?