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