我试图在Fragment内用Canvas画一条线。经过一番研究后,我似乎只需要扩展View类并覆盖onDraw,然后返回新View类的实例即可正常填充布局。但是,当我在设备上访问片段时,只能看到白屏。这是我到目前为止的内容:
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());
}
}
我在这里想念什么?
编辑:对于任何其他面临此问题的人,此代码原来可以正常工作。我在活动中显示它时遇到了问题。
创建自己的Widget类型时需要做的几件事:
视图应具有什么尺寸?你需要覆盖的一个或两个的onMeasure
和onLayout
。查看显示小部件的自定义小部件指南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) {}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句