android - Android 中的椭圆 View

标签 android android-canvas android-custom-view

<分区>

我需要创建一系列同心椭圆(环),并需要在这些椭圆的圆周上放置用户图标。请参见下图。

Rings View

到目前为止,我已经在 Canvas 上绘制了 3 个椭圆同心圆并放置了用户图标。 我需要用户图标可以在环上拖动。

请提出实现的方法。

最佳答案

因为看起来你已经在环的圆周上放置了图标,我假设你知道如何进行数学计算 [但请参阅编辑] 来确定圆周上的点并询问拖放.

您可能希望使用拖放方法实现图标移动。假设您将环保留为单个图像,那么您将只有一个放置目的地。然后,您需要以数学方式分析放置点 [请参阅编辑](通过确定其像素颜色)以确定图标被放置在哪个环中。如果您为环创建单独的 View ,那么每个环都可以是它自己的放置点。 (您可能最终需要弄清楚如何在每个圆环内重新分配图标,但这是另一个问题。)

下面是一些代码,展示了在单个 View 组(您将在其中显示戒指图像)上使用单个图像图标来处理拖放操作的最小方法。

主 Activity .java

package com.example.dragexample;

import android.app.Activity;
import android.content.ClipData;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.DragShadowBuilder;
import android.view.View.OnDragListener;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {

static final String TAG = "DragActivity";

ImageView icon = null;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    findViewById(R.id.rings).setOnDragListener(new OnDragListener() {
        @Override
        public boolean onDrag(View vw, DragEvent event) {
            if (event.getAction() == DragEvent.ACTION_DROP) {
                // Drop the icon and redisplay it:
                icon.setX(event.getX());
                icon.setY(event.getY());
                icon.setVisibility(View.VISIBLE);

                // Analyze the drop point mathematically (or perhaps get its pixel color)
                //  to determine which ring the icon has been dragged into and then take
                //  appropriate action.
                int destRing = determineDestinationRing(event.getX(), event.getY());
            }

            return true;
        }
    });

    icon = (ImageView) findViewById(R.id.icon);
    icon.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View vw, MotionEvent event) {
            Log.v(TAG, "Touch event " + event.getAction());
            if (event.getActionMasked() == MotionEvent.ACTION_MOVE) {
                Log.v(TAG, "Starting drag");

               // Set up clip data (empty) and drag shadow objects and start dragging:
                ClipData cd = ClipData.newPlainText("", "");
                DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(vw);
                vw.startDrag(cd, shadowBuilder, vw, 0);
                vw.setVisibility(View.INVISIBLE);
            }

            return true;
        }
    });
}

public void resetImage(View vw) {
    Log.v(TAG, "Resetting image position");

    icon.setX(0f);
    icon.setY(0f);
    icon.setVisibility(View.VISIBLE);
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/rings"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:onClick="resetImage" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

</FrameLayout>

编辑 1:

要从数学上确定图标被放到哪个环中,您可以使用类似下面的方法,它使用轴的硬编码大小循环执行椭圆的标准方程式。请注意,如果将图标放在最里面的“我”环内,将返回零。此外,由于在渲染布局时可能会调整屏幕上的圆环尺寸,因此这种方法在实践中会更具挑战性。在这种情况下,轴的最终尺寸将需要在运行时确定。

// Axis values must be ascending order; ring 0 is 'me';
float a[] = {50, 100, 150, 200};
float b[] = {100, 200, 300, 400};

public int determineDestinationRing(float x, float y) {

    // Check for inclusion within each ring:
    for (int i = 0; i < a.length; i++) {
        if (((x * x) / (a[i] * a[i]) + (y * y) / (b[i] * b[i])) <= 1)
            return i;
    }

    return -1;
}

关于android - Android 中的椭圆 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25182298/

相关文章:

android 方向 - Intent 问题(相机)

java - Wikia API 和 Android 编程不确定如何继续

android - 如何根据位图的 alpha 值在 Canvas 上绘制位图?

android - 如何将数据绑定(bind)变量作为 xml 属性传递给自定义 View

android - Canvas 不在自定义 View 中绘制

Android:安排应用程序以重复警报开始不起作用

Android OpenCV convertTo() 从 CV_32FC4 到 CV_8UC4

android - 使图像以循环方式消失

android - 将位图大小调整为更小的位图

android - 矩形无界波纹效果