如何使Android中的自定义视图透明

6

我是一名Android初学者,有一个比较简单的问题。我创建了一个自定义视图,然后通过xml将其注入到另一个布局中。我想让这个自定义视图的背景透明。

我的自定义视图在xml中的注入:

<com.sagar.utils.ConnectDotsView
                android:id="@+id/connect_dots_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

这是自定义 View 的代码:

public class ConnectDotsView extends View {

    private Bitmap mBitmap;
    private Canvas mCanvas;
    private Path mPath;
    private Paint mPaint;
    private static final int TOUCH_TOLERANCE_DP = 24;
    private static final int BACKGROUND = 0xFFDDDDDD;
    // Points to be connected.
    private List<Point> mPoints = new ArrayList<>();
    private int mLastPointIndex = 0;
    private int mTouchTolerance;
    private boolean isPathStarted = false;
    CompleteListener completeListener;

    public ConnectDotsView(Context context) {
        super(context);
        mCanvas = new Canvas();
        mPath = new Path();
        initPaint();
    }



    public interface CompleteListener {
        void onCompleteListener();
    }

    public void setOnCompleteListener(CompleteListener listener) {
        completeListener = listener;
    }

    public ConnectDotsView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mCanvas = new Canvas();
        mPath = new Path();
        initPaint();
    }

    public ConnectDotsView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mCanvas = new Canvas();
        mPath = new Path();
        initPaint();
    }

    public void clear() {
        mBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
        mBitmap.eraseColor(BACKGROUND);
        mCanvas.setBitmap(mBitmap);
        invalidate();
    }

    @Override
    protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
        super.onSizeChanged(width, height, oldWidth, oldHeight);
        clear();

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(BACKGROUND);
        canvas.drawBitmap(mBitmap, 0, 0, null);
        canvas.drawPath(mPath, mPaint);

        mPaint.setColor(Color.parseColor("#56CBF9"));
        // TODO remove if you don't want points to be visible.
        for (Point point : mPoints) {
            canvas.drawPoint(point.x, point.y, mPaint);
            mPaint.setColor(Color.BLACK);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touch_start(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touch_move(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touch_up(x, y);
                invalidate();
                break;
        }
        return true;
    }

    private void touch_start(float x, float y) {

        if (checkPoint(x, y, mLastPointIndex)) {
            mPath.reset();
            // User starts from given point so path can be drawn.
            isPathStarted = true;
        } else {
            // User starts move from point which does not belong to mPoints list
            isPathStarted = false;
        }

    }

    private void touch_move(float x, float y) {
        if (isPathStarted) {
            mPath.reset();
            Point point = mPoints.get(mLastPointIndex);
            mPath.moveTo(point.x, point.y);
            if (checkPoint(x, y, mLastPointIndex + 1)) {
                point = mPoints.get(mLastPointIndex + 1);
                mPath.lineTo(point.x, point.y);
                mCanvas.drawPath(mPath, mPaint);
                mPath.reset();
                ++mLastPointIndex;
            } else {
                int positionIndex = mLastPointIndex + 1;
                if (positionIndex >= mPoints.size()) {
                    completeListener.onCompleteListener();
                } else {
                    mPath.lineTo(x, y);
                }
            }
        }
    }

    private void touch_up(float x, float y) {
        mPath.reset();
        if (checkPoint(x, y, mLastPointIndex + 1) && isPathStarted) {
            // Move finished at valid point so I draw whole line.
            // That's the start point of current line segment.
            Point point = mPoints.get(mLastPointIndex);
            mPath.moveTo(point.x, point.y);
            // And that's the end point.
            point = mPoints.get(mLastPointIndex + 1);
            mPath.lineTo(point.x, point.y);
            mCanvas.drawPath(mPath, mPaint);
            mPath.reset();
            // Increment point index.
            ++mLastPointIndex;
            isPathStarted = false;
        }

    }

    /**
     * Checks if user touch point with some tolerance
     */
    private boolean checkPoint(float x, float y, int pointIndex) {
        if (pointIndex >= mPoints.size()) {
            // All dots already connected.
            return false;
        }
        Point point = mPoints.get(pointIndex);
        if (x > (point.x - mTouchTolerance) && x < (point.x + mTouchTolerance)) {
            if (y > (point.y - mTouchTolerance) && y < (point.y + mTouchTolerance)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Sets up paint attributes.
     */
    private void initPaint() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);
        mTouchTolerance = dp2px(TOUCH_TOLERANCE_DP);
    }

    /**
     * Converts dpi units to px
     *
     * @param dp
     * @return
     */
    private int dp2px(int dp) {
        Resources r = getContext().getResources();
        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics());
        return (int) px;
    }

    public void setPaint(Paint paint) {
        this.mPaint = paint;
    }

    public Bitmap getBitmap() {
        return mBitmap;
    }

    public List<Point> getPoints() {
        return mPoints;
    }

    public void setPoints(List<Point> points) {
        mLastPointIndex = 0;
        this.mPoints = points;
    }
}

我希望将上述自定义视图的背景设置为透明。我该如何通过xml或代码实现呢?
谢谢您的提前帮助。

2
私有静态最终整型 BACKGROUND = Color.TRANSPARENT; - Milos Lulic
请将以下与编程相关的内容从英文翻译成中文。只返回翻译后的文本:将您的评论作为答案添加,我会接受它。 - sagar suri
在你的xml中使用这个:android:background="@android:drawable/screen_background_light_transparent" - Tandoh Anthony Nwi-Ackah
如何控制透明度?@MilosLulic - sagar suri
请查看此链接:https://dev59.com/C10a5IYBdhLWcg3wk5hw - Gordon developer
1
@MilosLulic请将您的评论添加为答案。我会接受它。 - sagar suri
4个回答

4
在您的Class ConnectDotsView中更改:
private static final int BACKGROUND = 0xFFDDDDDD;

为了

private static final int BACKGROUND = Color.TRANSPARENT;

或者

private static final int BACKGROUND = Color.parseColor("#00000000");
#00AABBCC = ARGB (00 代表透明度,AA 代表红色,BB 代表绿色,CC 代表蓝色),00 透明度为 0%,FF 透明度为 100%。这意味着 #00AABBCC 是透明的,#80AABBCC 是 50% 的透明度,而 #FFAABBCC 不透明。

2

使用view.setAlpha(float opacity)方法可以改变父视图的透明度,其中0f表示完全透明的视图。


1
在您的initPaint()方法中,调用以下函数:
    setBackgroundColor(R.color.colorTransparent);

在 values/colors.xml 文件夹中,将你的 colorTransparent 设置为 RGBA 为 00:

<color name="colorTransparent">#00000000</color>

或者,在xml中调用自定义视图时,使用:android:background="#00000000"。

这应该可以解决您的问题。

编辑:

只需使用setBackgroundColor(Color.TRANSPARENT);

或者setBackgroundColor(0x00000000);

50%不透明度:setBackgroundColor(0x80000000);


如何控制透明度? - sagar suri
您可以通过xml控制透明度:进入声明视图的活动的xml的预览模式,然后打开属性选项卡,单击属性选项卡中“背景”属性旁边的三个点。然后在弹出的对话框中,在右上角单击“添加新资源”,然后单击“颜色资源”。现在,您可以选择自己喜欢的颜色和底部的alpha(透明度)。 - Robillo

1
为了控制透明度的程度,请使用@Robillo的代码,但要修改这个:
<color name="colorTransparent">#xy000000</color>

将xy替换为您所需的不透明度。00表示完全透明,FF表示完全不透明(即白色)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接