1

我是 Android 新手,我仍在寻找好的资源。

我的问题涉及在屏幕上绘制矩形对象网格的最佳方法。我需要网格中显示的每个对象都有一个初始文本(或作为文本的 int)值,当用户触摸该对象时,文本将变为彩色形状。此外,每个对象都需要知道(或能够找出)其直接邻居的状态。

我不知道要扩展哪个类才能同时显示文本和形状,并能够处理触摸输入。

感谢您的帮助。

编辑:我很抱歉,但我不知道如何更清楚。也许一些背景会有所帮助。我有一个主要活动,它将一个 int 值作为输入并创建一个 Intent 将该值发送到另一个活动。然后,其他活动显示 100 个随机数的网格。用户需要选择一系列网格点,用户选择的一定数量的点将从随机数变为彩色形状。更改的点由我将在代码中提供的逻辑控制。

4

2 回答 2

1

SO Q with basic android graph:Android中的自定义动态图

Android 官方自定义控件指南

https://developer.android.com/guide/topics/ui/custom-components.html

视图控件上的 Android 参考页面,您将在该页面上进行扩展

https://developer.android.com/reference/android/view/View.html

自定义视图控件的真实世界代码示例(您特​​别感兴趣onDraw()

http://www.java2s.com/Open-Source/Android/App/ringdroid/com/ringdroid/WaveformView.java.htm

于 2013-02-17T04:41:23.260 回答
0

我知道这个问题被问了很长时间,但也许它会帮助人们:)

将此添加到“ attrs.xml ”(或根据需要创建新的)

<resources>
<declare-styleable name="RectanglesGridView">
    <attr name="cellSize" format="dimension" />
    <attr name="cellColor1" format="color" />
    <attr name="cellColor2" format="color" />
</declare-styleable>

这就是类 - “ RectanglesGridView.java

package com.gilapps.movinglivewallpaper.UI.views;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Build;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;

import com.gilapps.movinglivewallpaper.R;

public class RectanglesGridView extends View {
    private final static float DEFAULT_CELL_SIZE_DP = 10;
    private final static int DEFAULT_CELL_COLOR1 = Color.GRAY;
    private final static int DEFAULT_CELL_COLOR2 = Color.WHITE;
    private int mColor1 = DEFAULT_CELL_COLOR1;
    private int mColor2 = DEFAULT_CELL_COLOR2;
    private float mCellSize;
    private Paint mPaint;
    private boolean mIsColor1;
    private int mWidth;
    private int mHeight;

    public RectanglesGridView(Context context) {
        super(context);
        mCellSize = convertDpToPixel(DEFAULT_CELL_SIZE_DP);
        mPaint = new Paint();

    }

    public RectanglesGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        loadAttributes(context, attrs);


    }



    public RectanglesGridView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPaint = new Paint();
        loadAttributes(context, attrs);
    }


    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public RectanglesGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        mPaint = new Paint();
        loadAttributes(context, attrs);
    }

    private void loadAttributes(Context context, AttributeSet attrs) {
        TypedArray a = context.getTheme().obtainStyledAttributes(
                attrs,
                R.styleable.RectanglesGridView,
                0, 0);

        try {
            mCellSize = a.getDimension(R.styleable.RectanglesGridView_cellSize, convertDpToPixel(DEFAULT_CELL_SIZE_DP));
            mColor1 = a.getColor(R.styleable.RectanglesGridView_cellColor1, DEFAULT_CELL_COLOR1);
            mColor2 = a.getColor(R.styleable.RectanglesGridView_cellColor2, DEFAULT_CELL_COLOR2);

        } catch (Exception e) {
            mCellSize = convertDpToPixel(DEFAULT_CELL_SIZE_DP);
        } finally {
            a.recycle();
        }
    }

    private float convertDpToPixel(float dp){
        Resources resources = getContext().getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
        return px;
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mWidth = w;
        mHeight = h;
        super.onSizeChanged(w, h, oldw, oldh);


    }

    @Override
    protected void onDraw(Canvas canvas) {
        for (float r=0;r<mHeight;r+=mCellSize) {
            for (float c=0;c<mWidth;c+=mCellSize) {
                mPaint.setColor(mIsColor1 ? mColor2 : mColor1);
                mIsColor1 = !mIsColor1;
                canvas.drawRect(c,r,c+mCellSize,r+mCellSize,mPaint);
            }
            mIsColor1 = !mIsColor1;
        }


        super.onDraw(canvas);
    }
}

用法:

<com.gilapps.movinglivewallpaper.UI.views.RectanglesGridView
            app:cellColor1="#33000000"
            app:cellColor2="white"
            app:cellSize="10dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
  • 添加xmlns:app="http://schemas.android.com/apk/res-auto"到根视图
  • 如果需要,更改包名称
  • 享受!:)
于 2017-04-30T04:39:56.520 回答