如何创建转轮控件?

Posted

技术标签:

【中文标题】如何创建转轮控件?【英文标题】:How To Create a Rotating Wheel Control? 【发布时间】:2012-04-30 15:38:51 【问题描述】:

我正在尝试在android中实现转轮,就像下面显示的图片一样。我从link看到了教程。但我想实现如下图所示。***由单独的图像组成。有人对这个实现有任何想法吗?任何帮助将不胜感激。

提前致谢。

阿卡什

【问题讨论】:

我尝试了问题中提到的链接中的教程,其中图像被绘制,但我想使用资源中的图像。并处理那里的点击事件。 检查这个例子:Android SDK: Creating a Rotating Dialer @PareshMayani 与我从mindtherobot.com/blog/wp-content/uploads/2010/07/dialview.zip 实现的样本相同。你能通过分享分成相等部分的环/圆的代码来帮助我吗?旋转这些分割的部分并处理那里的点击事件。 This 可以提供帮助。还要检查this example。 【参考方案1】:

要从头开始执行此操作,您需要一种将触摸坐标转换为极坐标(以获得旋转角度)的方法。这可以像这样轻松完成:

private float cartesianToPolar(float x, float y) 
  return (float) -Math.toDegrees(Math.atan2(x - 0.5f, y - 0.5f));

要旋转图像视图或用于显示旋钮的元素,可以使用如下矩阵:

Matrix matrix=new Matrix();
ivRotor.setScaleType(ScaleType.MATRIX);   
matrix.postRotate((float) deg, m_nWidth/2, m_nHeight/2);//getWidth()/2, getHeight()/2);
ivRotor.setImageMatrix(matrix);

其中 deg 是角度,ivRobor 是旋钮图像视图。

适用于 Android 的完整工作示例可在 Google 代码中找到:https://code.google.com/p/android-rotaryknob-view/

【讨论】:

我一直在创建一个旋转 150 到 210 度的旋钮。你能帮我看看我的问题***.com/questions/27728913/… 你给定的代码不是视图,我怎么能把它改成视图?这样我就可以将它添加到 xml 中。【参考方案2】:

应用在 imageView 上的 OnTouchListener 上,通过它我得到了三个事件,即:

    MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVE & MotionEvent.ACTION_UP

MotionEvent.ACTION_DOWN 获取用户触摸的角度,MotionEvent.ACTION_UP 获取用户释放的角度。

得到两个角度的差异后,旋转那个角度的图像。

旋转图像后,通过角度检查象限并保持 int 变量,该变量根据象限递增,并通过满足条件设置新图像(所需的图像)。

根据int变量的值维护点击事件。

【讨论】:

@hardikjoshi 我只是使用 pareshmayani 提出的概念,您可以在其中旋转图像,我的要求是旋转图像中具有不同部分的圆圈并获取每个部分的位置旋转图像时的部分。【参考方案3】:

这是完整的代码:

import android.animation.ObjectAnimator;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.graphics.Matrix;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.util.Random;

public class MainActivity extends Activity
//  Button rotate;
ImageView i;
ImageView ii;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    i= (ImageView) findViewById(R.id.i);
    i.setImageResource(R.drawable.gg);
    ii= (ImageView) findViewById(R.id.ii);
    ii.setImageResource(R.drawable.gg);

    // i.setBackgroundColor(Color.rgb(255, 255, 255));


public void ii(View v)


    RotateAnimation rotate =
            //new RotateAnimation(0f,generateRandomNumber(),55f,55f);
            new RotateAnimation(0, generateRandomNumber(), 
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

    rotate.setDuration(1500);
    rotate.setInterpolator(new LinearInterpolator());
    i.startAnimation(rotate);
    i.setRotation(generateRandomNumber());
    RotateAnimation rotate1 =
            //new RotateAnimation(0f,generateRandomNumber(),55f,55f);
            new RotateAnimation(0, 999999999, Animation.RELATIVE_TO_SELF, 
 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    rotate1.setDuration(99999);

    rotate1.setInterpolator(new LinearInterpolator());
    // i= (ImageView) findViewById(R.id.i);
    //     i.setImageResource(R.drawable.g);

    ii.startAnimation(rotate1);

/*i= (ImageView) findViewById(R.id.i);
    i.setImageResource(R.drawable.g);
    ObjectAnimator animator = ObjectAnimator.ofFloat(i,"rotationY", 360f);
    animator.setDuration(1000);
    animator.start();
 */

   /* Matrix matrix = new Matrix();
   i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);   //required
    matrix.postRotate(generateRandomNumber());
  i.setImageMatrix(matrix);
 */




   /* Matrix matrix = new Matrix();
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), 
 R.drawable.g);
   matrix.postRotate(generateRandomNumber());

    Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 
 0,bMap.getWidth(),bMap.getHeight(), matrix, true);
    i.setImageBitmap(bMapRotate);*/



public float generateRandomNumber() 

    Random rand = new Random();
    int randomNum = rand.nextInt((10000000 - 125000) + 1);

    return (float)randomNum;




int backpressed=0;
@Override
public void onBackPressed() 
    backpressed++;
    if(backpressed>1)
    
        super.onBackPressed();
        finish();
    
    else
    
        Toast.makeText(this, "Press back again to exit", 
  Toast.LENGTH_LONG).show();
        new Thread(new Runnable() 
            @Override
            public void run() 
                try
                    Thread.sleep(2000);
                catch (Exception e)
                
                    e.printStackTrace();
                
                backpressed=0;
            
        );
    


这是 XML:

tools:context=".MainActivity">
<TextView
    android:layout_
    android:layout_
    android:text=".............."
    android:textColor="#00ff10"
    android:textStyle="bold"
    android:textSize="25dp"
    android:layout_gravity="center"/>
<ImageView
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:src="@drawable/a"

    />
<ImageView
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:id="@+id/i"

    />
<DigitalClock
    android:layout_
    android:layout_
    android:layout_gravity="center"/>
<Button
    android:layout_
    android:layout_
    android:text="Play"
    android:backgroundTint="#ff0044"
    android:id="@+id/rotate"
    android:layout_gravity="center"
    android:onClick="ii"/>
<TextView
    android:layout_
    android:layout_
    android:text="powered by ashwani"
    android:textColor="#00ff10"
    android:textStyle="bold"
    android:layout_gravity="center"/>
<ImageView
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:id="@+id/ii"

    />

【讨论】:

以上是关于如何创建转轮控件?的主要内容,如果未能解决你的问题,请参考以下文章

在视图中重叠 UIControls

Android 高版本日历恢复转轮(DatePicker)

造轮子系列转轮选择工具——WheelView

动态创建MFC控件时如何重新创建资源编辑器使用的样式?

如何创建 Windows GUI 控件 ID?

如何创建特定类型的用户控件