gpt4 book ai didi

android - 在 Android 中使用 Canvas 在 Fragment 中画一条线

转载 作者:行者123 更新时间:2023-11-29 21:28:59 24 4
gpt4 key购买 nike

我正在尝试在 Fragment 中使用 Canvas 画一条线。经过一些研究,我似乎只需要扩展 View 类并覆盖 onDraw,然后返回我通常会膨胀布局的新 View 类的实例。但是,当我在我的设备上访问该 fragment 时,我看到的只是一个白屏。这是我目前所拥有的:

package com.example.testing;

import android.app.Fragment;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class LineTab extends Fragment
{

private class DrawView extends View {
Paint paint = new Paint();

public DrawView(Context context) {
super(context);
paint.setColor(Color.BLACK);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setColor(Color.BLACK);
}
public DrawView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
paint.setColor(Color.BLACK);
}

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

canvas.drawLine(0, 0, 50, 50, paint);
canvas.drawLine(50, 0, 0, 50, paint);
}

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

int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
this.setMeasuredDimension(parentWidth, parentHeight);
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);

return new DrawView(this.getActivity());
}
}

我在这里错过了什么?

编辑:对于遇到此问题的任何其他人,这段代码都可以正常工作。我只是在我的 Activity 中显示它时遇到了问题。

最佳答案

创建自己类型的 Widget 时需要做的几件事:

  • View 应该有多大?您需要覆盖 onMeasureonLayout 之一或两者。检查Guide to customizing widgets这显示了应该进入 onMeasure 的内容。

  • 覆盖/实现所有三个构造函数。这在您的情况下更像是可选的,您不会通过 XML 膨胀。但这样做是一种很好的风格。

这应该会让您至少向前迈出一步。也许该代码还有其他问题。让我们看看。

编辑:第二种方法是使用Drawable 和通常的ImageView 在屏幕上绘制。这更直接并且需要更少的代码行。

这是将 ImageView 放在屏幕上的 XML。请注意,它定义android:src

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

<ImageView
android:id="@+id/drawLineImageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFFFF" />

</FrameLayout>

现在您可以对可绘制对象进行编码并将其连接到 ImageView:

public class DrawLineActivity extends Activity {
/* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.draw_line);

// Create a simple drawable and set it in the ImageView
((ImageView) findViewById(R.id.drawLineImageView)).setImageDrawable(new MyDrawable());
}

private class MyDrawable extends Drawable {
@Override
public void draw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawLine(0, 0, 50, 50, paint);
canvas.drawLine(50, 0, 0, 50, paint);
}

@Override
public int getOpacity() {return 0;}

@Override
public void setAlpha(int alpha) {}

@Override
public void setColorFilter(ColorFilter cf) {}
}
}

关于android - 在 Android 中使用 Canvas 在 Fragment 中画一条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19897672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com