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

标签 android android-fragments android-canvas

我试图在 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/

相关文章:

java - 如何为 View 创建自定义阴影?

安卓 "Could not find method android.app.Notification$Builder.setLocalOnly "

android - BottomSheetView 中的 animateLayoutChanges ="true"显示意外行为

android - 使用特定于 fragment 的 "adjustPan"或 "adjustResize"

android - 何时以及如何退出文件上传服务

java - 阶段中的 LibGDX Actor 未收到点击事件

android - 当音频插孔连接或忙碌时在 fragment 内切换图像

android - android 中的可绘制文本与左对齐

android - 我的 paintview android 中的重做撤消操作问题

安卓绘画/ Canvas 问题;绘制平滑曲线