如何从一个类中绘制不同的视图

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (7)

我想使用布尔变量来绘制一个或另一个类。我有2个类(例如A和B),它们扩展了具有onDraw方法的View。现在我想创建一个通过布尔值控制的类,如果我绘制A或B;

当我创建我的活动时,我想创建一个这个类的视图,如果我将它的布尔变量设置为true / false来绘制A / B;

我可以把所有东西放在一个类中,并有两个方法来绘制不同的元素。但我想要两个单独的课程

我不知道继承是否是正确答案,我不知道该怎么做

public class Parent extends View {

    private boolean modeCell;
    private A cellNote;
    private B cellTest;

    public Parent(Context context) {
        super(context);
    }

    public Parent(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (modeCell)
        {
            cellTest.draw(canvas);//??
        }
        else{
            cellNote.draw(canvas);//??
        }
    }

    public boolean isModeCell() {
        return modeCell;
    }

    public void setModeCell(boolean modeCell) {
        this.modeCell = modeCell;
    }

    public A getCellNote() {
        return cellNote;
    }

    public void setCellNote(A cellNote) {
        this.cellNote = cellNote;
    }

    public B getCellTest() {
        return cellTest;
    }

    public void setCellTest(B cellTest) {
        this.cellTest = cellTest;
    }
}
public class A extends Parent {

    private int[] noteNumbers;
    private int cellNoteSize;
    private int width;
    private int height;
    private int noteWidth;
    private int noteHeight;
    private int paddingLeft;
    private int paddingRight;
    private int paddingTop;
    private int paddingBottom;

    public A(Context context) {
        super(context);
        noteNumbers = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
        cellNoteSize = (int) Math.sqrt(noteNumbers.length);
    }

    public A(Context context, AttributeSet attrs) {
        super(context, attrs);
        noteNumbers = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
        cellNoteSize = (int) Math.sqrt(noteNumbers.length);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        this.width = getMeasuredWidth();
        this.height = getMeasuredHeight();
        this.width = width - paddingLeft - paddingRight;
        this.height = height - paddingTop - paddingBottom;
        this.paddingLeft = getPaddingLeft();
        this.paddingRight = getPaddingRight();
        this.paddingTop = getPaddingTop();
        this.paddingBottom = getPaddingBottom();
        this.noteWidth = width / cellNoteSize;
        this.noteHeight = height / cellNoteSize;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint mCellNotePaint = new Paint();
        mCellNotePaint.setAntiAlias(true);

        Paint rectPaint = new Paint();
        RectF rect = new RectF(paddingLeft, paddingTop, paddingLeft + width, paddingTop + height);
        rectPaint.setColor(Color.YELLOW);
        rectPaint.setStyle(Paint.Style.FILL);
        canvas.drawRect(rect, rectPaint);

        Rect rectNote = new Rect(paddingLeft, paddingTop, paddingLeft + noteWidth, paddingTop + noteHeight);
        rectPaint.setColor(Color.RED);
        rectPaint.setStyle(Paint.Style.FILL);
        canvas.drawRect(rectNote, rectPaint);

        String textSample = (cellNoteSize <= 3) ? "9" : "16";
        float fontSize = adjustFontSize(mCellNotePaint, textSample, noteHeight, 80);
        Rect bounds = new Rect();
        mCellNotePaint.getTextBounds(textSample, 0, textSample.length(), bounds);
        float measureText = mCellNotePaint.measureText(textSample);
        float xOffset = (noteWidth - measureText) / 2;
        float yOffset = (noteHeight + bounds.height()) / 2;
        mCellNotePaint.setTextSize(fontSize);

        for (int number = 1; number <= noteNumbers.length; number++) {
            int n = number - 1;
            int c = n % cellNoteSize;
            int r = n / cellNoteSize;
            String textValue = String.valueOf(number);
            canvas.drawText(textValue, paddingLeft + c * noteWidth + xOffset, paddingTop + r * noteHeight + yOffset, mCellNotePaint);
        }
    }


    public int getCellNoteSize() {
        return cellNoteSize;
    }

    public void setCellNoteSize(int cellNoteSize) {
        this.cellNoteSize = cellNoteSize;
    }

    private float adjustFontSize(Paint paint, String text, float ViewHeight, float percentage) {

        paint.setTextSize(100);
        paint.setTextScaleX(1.0f);
        Rect bounds = new Rect();
        paint.getTextBounds(text, 0, text.length(), bounds);
        int h = bounds.bottom - bounds.top;
        float target = (float) ViewHeight * percentage / 100f;
        float size = ((target / h) * 100f);
        return size;
    }
}
public class B extends Parent {
//variables
//onDraw something else
}


布局在我的活动布局中,我希望有1个父视图来绘制A / B.

        a = new A(this);
        b = new B(this);
        parent = findViewById(R.id.idparent);
        parent.setModeCell(true);//or false
        parent.setA(a);
        parent.setB(b);
提问于
用户回答回答于

你可以用这个方法做 check the type of View is A or B


 if (view instanceof A){
 //do something 
  }

  else  if (view instanceof B){
 //do something 
  }

热门问答

急急急!!核验图片验证码填写到接入备案企业侧备案系统中,在哪操作啊?

无聊至极互联网重度用户
推荐
你反馈的上海备案的APP核验验证码吗?如果是的话,提交订单的时候直接写验证码就可以的。 在补充材料的下面 image.png ... 展开详请

存储桶和项目概念?

Hyman.W

腾讯云 · 高级产品经理 (已认证)

推荐
一个存储桶对应多个项目的管理方式,可以使用 “标签” 来管理, 在创建存储桶或者修改存储桶配置的页面可以添加。 参考: 1,存储桶标签使用 https://cloud.tencent.com/document/product/436/34830 2,如果需要通过外部系统来管理...... 展开详请

智能钛能处理大数据文件吗?我有30G的数据存储在本地电脑硬盘上?

腾讯智能钛AI开发者

腾讯云 · 智能钛产品团队 (已认证)

腾讯智能钛产品团队官方运营账号。分享产品最新动态,第一时间解答用户疑问。
推荐

硬盘可以升级吗?

最爱开车啦互联网的敏感者
推荐

可以升级,小微活动中没有云硬盘的的,后续可以用同帐号在官网购买和服务器同地域同地区的云硬盘挂载到服务器上使用。

云硬盘挂载初始化方法 可参考 https://cloud.tencent.com/document/product/362/6735

云通信 70402 错误?

推荐已采纳

参数非法,请检查必填字段是否填充,或者字段的填充是否满足协议要求。

您好,可参考此文档:https://cloud.tencent.com/document/product/269/1671

录音识别sdk的录音文件如何保存?

Richel码农
推荐

1.实时语音sdk内置录音器采集音频暂不支持保存语音数据,如需要保存语音数据建议上层自行采集音频数据。

2.实时语音识别sdk不支持暂停&继续操作,停止识别后重新调用start即开始识别。

所属标签

扫码关注云+社区

领取腾讯云代金券