mainActivity中的矩形绘制调用

时间:2018-02-15 22:01:45

标签: android canvas draw

我在activity_main文件夹中绘制一个矩形,我将这些值绘制在integer.xml中,但我不想这样做.getInteger(R.integer.scanner_rect_width和getResources()。getInteger(R.integer) .scanner_rect_height我从integer.xml文件夹中获取这些值,但是如何通过创建mainActivity对象来分配这些值?

ScannerOverlay scannerOverlay = new ScannerOverlay();如

ScanerOverlay.java

   public class ScannerOverlay extends ViewGroup {
private float left, top, endY;
private int rectWidth, rectHeight;
private int frames;
private boolean revAnimation;
private int lineColor, lineWidth;



public ScannerOverlay(Context context) {
    super(context);

}

public void setWidth(int pixels) {
    rectWidth = pixels;
    requestLayout();
    invalidate();
}

public void setHeight(int pixels) {
    rectHeight = pixels;
    requestLayout();
    invalidate();
}

public ScannerOverlay(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public ScannerOverlay(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    TypedArray a = context.getTheme().obtainStyledAttributes(
            attrs,
            R.styleable.ScannerOverlay,
            0, 0);
    rectWidth = a.getInteger(R.styleable.ScannerOverlay_square_width, 150);
    rectHeight = a.getInteger(R.styleable.ScannerOverlay_square_height, 150);
    lineColor = a.getColor(R.styleable.ScannerOverlay_line_color, ContextCompat.getColor(context, R.color.scanner_line));
    lineWidth = a.getInteger(R.styleable.ScannerOverlay_line_width, getResources().getInteger(R.integer.line_width));
    frames = a.getInteger(R.styleable.ScannerOverlay_line_speed, getResources().getInteger(R.integer.line_width));
}

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

@Override
public void onLayout(boolean changed, int left, int top, int right, int bottom) {
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    left = (w - dpToPx(rectWidth)) / 2;
    top = (h - dpToPx(rectHeight)) / 2;
    endY = top;
    super.onSizeChanged(w, h, oldw, oldh);
}

public int dpToPx(int dp) {
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
}

@Override
public boolean shouldDelayChildPressedState() {
    return false;
}

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

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // draw transparent rect
    int cornerRadius = 0;
    Paint eraser = new Paint();
    eraser.setAntiAlias(true);
    eraser.setColor(Color.WHITE);

    RectF rect = new RectF(left, top, dpToPx(rectWidth) + left, dpToPx(rectHeight) + top);
    canvas.drawRoundRect(rect, (float) cornerRadius, (float) cornerRadius, eraser);

    // draw horizontal line
    Paint line = new Paint();
    line.setColor(lineColor);
    line.setStrokeWidth(Float.valueOf(lineWidth));

    // draw the line to product animation
    if (endY >= top + dpToPx(rectHeight) + frames) {
        revAnimation = true;
    } else if (endY == top + frames) {
        revAnimation = false;
    }

    // check if the line has reached to bottom
    if (revAnimation) {
        endY -= frames;
    } else {
        endY += frames;
    }
    canvas.drawLine(left, endY, left + dpToPx(rectWidth), endY, line);
    invalidate();
}
   }

activity_main.xml中

    <android.support.constraint.ConstraintLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
       android:layout_height="match_parent"
      tools:context="com.example.yavuz.myapplication.MainActivity">

<com.example.yavuz.myapplication.ScannerOverlay
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#44000000"
app:line_color="#7323DC"
app:line_speed="6"
app:line_width="4"

/&GT;

MainActivity.java

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



}
        }

1 个答案:

答案 0 :(得分:0)

您必须为宽度和高度创建setter方法,如下所示:

public void setWidth(int pixels) {
        rectWidth = pixels;
        requestLayout();
        invalidate();
}

public void setHeight(int pixels) {
        rectHeight = pixels;
        requestLayout();
        invalidate();
}

然后使用它来使用MainActivity,如下所示:

ScannerOverlay scannerOverlay = new ScannerOverlay();
scannerOverlay.setWidth(200); // for example
scannerOverlay.setHeight(300);

setContentView(scannerOverlay);

我认为ScannerOverlay是一个自定义视图。

来自xml布局:

<thepackage_where_theclass.ScannerOverlay
app:scanner_rect_width="200"
app:scanner_rect_height="200"/>