首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >透明SurfaceView

透明SurfaceView
EN

Stack Overflow用户
提问于 2018-01-07 05:05:24
回答 2查看 951关注 0票数 0

在我的项目中,我有一个操纵杆。下面是它的样子

我的问题是那黑色,如何使它透明。

这是我的密码

代码语言:javascript
复制
public class JoyStickView extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener{
private float centerX;
private float centerY;
private float baseRadius;
private float hatRadius;
private JoyStickListener joyStickCallback;

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

       getHolder().setFormat(PixelFormat.TRANSPARENT);
       getHolder().addCallback(this);

       setZOrderOnTop(true);

       setOnTouchListener(this);

       if(context instanceof JoyStickListener){
          joyStickCallback = (JoyStickListener)context;
       }
    }

...
}

我的.xml

代码语言:javascript
复制
<RelativeLayout 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.akoni.control.Controller">

<com.example.akoni.control.JoyStickView
    android:id="@+id/joyStickLeft"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="50dp"
    android:layout_marginBottom="10dp"/>

<com.example.akoni.control.JoyStickView
    android:id="@+id/joyStickRight"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_alignBottom="@+id/joyStickLeft"
    android:layout_alignParentEnd="true"
    android:layout_marginEnd="50dp" />

</RelativeLayout>

编辑的

Joystick的完整代码。

代码语言:javascript
复制
public class JoyStickView extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener{
private float centerX;
private float centerY;
private float baseRadius;
private float hatRadius;
private JoyStickListener joyStickCallback;

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

    getHolder().setFormat(PixelFormat.TRANSPARENT);
    getHolder().addCallback(this);
    setZOrderOnTop(true);
    setOnTouchListener(this);

    if(context instanceof JoyStickListener){
        joyStickCallback = (JoyStickListener)context;
    }
}

public JoyStickView(Context context, AttributeSet attributeSet, int style){
    super(context, attributeSet, style);
    getHolder().addCallback(this);
    setOnTouchListener(this);

    if(context instanceof JoyStickListener){
        joyStickCallback = (JoyStickListener)context;
    }
}

public JoyStickView(Context context, AttributeSet attributeSet){
    super(context, attributeSet);
    getHolder().addCallback(this);
    setOnTouchListener(this);

    if(context instanceof JoyStickListener){
        joyStickCallback = (JoyStickListener)context;
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder){
    setupDimensions();
    drawJoyStick(centerX, centerY);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
public boolean onTouch(View v, MotionEvent event) {
    final float displacement;
    final float constrainX;
    final float constrainY;
    final float ratio;
    if(v.equals(this)){
        displacement = (float) Math.sqrt(Math.pow(event.getX() - centerX, 2) + Math.pow(event.getY() - centerY, 2));
        if(event.getAction() != MotionEvent.ACTION_UP){
            if(displacement < baseRadius) {
                drawJoyStick(event.getX(), event.getY());
                joyStickCallback.onJoyStickMoved((event.getX() - centerX)/baseRadius, (event.getY() - centerY)/baseRadius, getId());
            }
            else {
                ratio = baseRadius / displacement;
                constrainX = centerX + (event.getX() - centerX) * ratio;
                constrainY = centerY + (event.getY() - centerY) * ratio;

                drawJoyStick(constrainX, constrainY);
                joyStickCallback.onJoyStickMoved((constrainX - centerX)/baseRadius, (constrainY - centerY)/baseRadius, getId());
            }
        }
        else if(event.getAction() == MotionEvent.ACTION_UP){
            drawJoyStick(centerX, centerY);
            joyStickCallback.onJoyStickMoved(0, 0, getId());
        }
    }

    return true;
}

public void setupDimensions(){
    centerX = getWidth() / 2;
    centerY = getHeight() / 2;
    baseRadius = Math.min(getWidth(), getHeight()) / 3;
    hatRadius = Math.min(getWidth(), getHeight()) / 6;
}

public void drawJoyStick(float newX, float newY){

    if(getHolder().getSurface().isValid()) {
        Canvas canvas = this.getHolder().lockCanvas();
        Paint color = new Paint();

        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

        //base Circle
        color.setARGB(100, 50, 50, 50);
        canvas.drawCircle(centerX, centerY, baseRadius, color);

        //top Circle
        color.setARGB(255, 0, 0, 255);
        canvas.drawCircle(newX, newY, hatRadius, color);

        getHolder().unlockCanvasAndPost(canvas);
    }
}

public interface JoyStickListener{
    void onJoyStickMoved(float xPercent, float yPercent, int source);
}

}

黑色还在。我只想看到操纵杆,圆圈。不过,它已经开始运作了。谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2018-01-07 06:44:01

你的操纵杆图像有阿尔法通道吗?如果不是,用"Gimp“编辑,然后添加一个alpha唱诵并擦除黑色区域。

票数 0
EN

Stack Overflow用户

发布于 2018-02-23 16:10:44

您必须更改三行代码的顺序:

代码语言:javascript
复制
    setZOrderOnTop(true);
    getHolder().addCallback(this); 
    getHolder().setFormat(PixelFormat.TRANSPARENT);

并将它们放入所有的JoyStickView中。对我来说很管用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48134490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档