如何在Android中创建半透明的说明页面?

如何在Android中创建半透明的说明页面?,android,Android,我是Android新手,在过去的两天里一直在努力解决这个问题,但我能找到解决方案。我们将非常感谢您的帮助。如何为Android Market中的应用卡路里计数器创建半透明的说明页面 创建一个新活动,并将顶层视图设置为半透明背景: android:background="#c0000000" 编辑:您还需要声明活动具有透明背景。为清单中的活动设置此主题将起作用: android:theme="@android:style/Theme.Translucent" 我也试过做类似的事情。我使用活动创

我是Android新手,在过去的两天里一直在努力解决这个问题,但我能找到解决方案。我们将非常感谢您的帮助。如何为Android Market中的应用卡路里计数器创建半透明的说明页面


创建一个新活动,并将顶层视图设置为半透明背景:

android:background="#c0000000"
编辑:您还需要声明活动具有透明背景。为清单中的活动设置此主题将起作用:

android:theme="@android:style/Theme.Translucent"

我也试过做类似的事情。我使用活动创建了消息对话框。对于此活动,我在清单中写道:

<activity android:name=".MessDial"
 android:label="@string/lblDialog"
 android:theme="@style/Theme.Transparent">
</activity>

在这项活动的主体中,我没有任何关于透明度的特殊内容


我希望它能对您有所帮助。

您可以尝试此示例,在不使用任何其他库的情况下显示首次指令屏幕
如果希望仅在第一次显示指令,可以向首选项存储添加一些标志。可以找到一个例子


我刚刚在我的一个项目中实现了Ted的答案。伟大的非常容易实现,效果非常好。非常感谢Ted

但是,由于堆栈溢出是为了获取和共享,我想分享我的定制视图实现,该视图以“针”的形式创建箭头,我使用Ted的方法来完成原始答案。代码如下:

package com.yourpackage;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.View;
import de.nantoka.miep.R;

public class CoachmarkArrow extends View {

    private static final float CIRCLE_RADIUS = 1.5f;
    private static final int TOPLEFT = 0;
    private static final int TOPRIGHT = 1;
    private static final int BOTTOMLEFT = 2;
    private static final int BOTTOMRIGHT = 3;

    Paint paint;
    int from, to;

    PointF padding = new PointF();
    PointF fromPoint = new PointF();
    PointF toPoint = new PointF();

    public CoachmarkArrow (Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CoachmarkArrow, 0, 0);

        getPaint(a);
        getFromTo(a);

        a.recycle();
    }

    private void getFromTo(TypedArray a) {

        from = a.getInt(R.styleable.CoachmarkArrow_from, BOTTOMLEFT);
        to = a.getInt(R.styleable.CoachmarkArrow_to, TOPLEFT);
    }

    private void getPaint(TypedArray a) {
        paint = new Paint();

        paint.setColor(a.getColor(R.styleable.CoachmarkArrow_color, Color.WHITE));
        paint.setStrokeWidth(a.getDimensionPixelSize(R.styleable.CoachmarkArrow_size, 0));

        paint.setStrokeCap(Paint.Cap.BUTT);
        paint.setAntiAlias(true);
    }

    @Override
    protected void onDraw (Canvas canvas){
        calculatePadding(canvas);
        calculateLinePoints();

        drawLine(canvas, fromPoint, toPoint);
        drawCircle(canvas, fromPoint);
    }

    private void calculateLinePoints() {
        fromPoint = getPoint(from);
        toPoint = getPoint(to);
    }

    private void calculatePadding(Canvas canvas) {

        padding.x = CIRCLE_RADIUS * paint.getStrokeWidth() / canvas.getWidth();
        padding.y = CIRCLE_RADIUS * paint.getStrokeWidth() / canvas.getHeight();
    }

    private PointF getPoint(int position) {
        PointF point = new PointF();

        if (position == TOPRIGHT || position == BOTTOMRIGHT){
            point.x = 1.0f - padding.x;
        }
        else {
            point.x = padding.x;
        }

        if (position == BOTTOMLEFT || position == BOTTOMRIGHT){
            point.y = 1.0f - padding.y;
        }
        else {
            point.y = padding.y;
        }       

        return point;
    }

    private void drawCircle(Canvas canvas, PointF fromPoint) {

        canvas.drawCircle(
                canvas.getWidth() * fromPoint.x, 
                canvas.getHeight() * fromPoint.y, 
                CIRCLE_RADIUS * paint.getStrokeWidth(), 
                paint
                );
    }

    private void drawLine(Canvas canvas, PointF fromPoint, PointF toPoint) {
        canvas.drawLine(
                canvas.getWidth() * fromPoint.x, 
                canvas.getHeight() * fromPoint.y, 
                canvas.getWidth() * toPoint.x, 
                canvas.getHeight() * toPoint.y, 
                paint
                );
    }
}
将此类添加到项目中(任何包名称都可以),并在res/values下为XML参数创建一个属性文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CoachmarkArrow">
        <attr name="size" format="dimension" />
        <attr name="color" format="color" />
        <attr name="from" format="enum">
            <enum name="topleft" value="0"/>
            <enum name="topright" value="1"/>
            <enum name="bottomleft" value="2"/>
            <enum name="bottomright" value="3"/>
        </attr>
        <attr name="to" format="enum">
            <enum name="topleft" value="0"/>
            <enum name="topright" value="1"/>
            <enum name="bottomleft" value="2"/>
            <enum name="bottomright" value="3"/>
        </attr>
    </declare-styleable>
</resources>

例如,现在您可以像其他视图一样在coachmarks活动的XML布局中创建“针”

<com.yourpackage.CoachmarkArrow
    xmlns:coachmark="http://schemas.android.com/apk/res/com.yourproject"    
    android:layout_height="100dp"
    android:layout_width="match_parent"
    coachmark:size="3dip"
    coachmark:color="@android:color/white"
    coachmark:from="bottomright"
    coachmark:to="topleft"
/>  

创建一个“指针”,其头部位于右下角,尖端位于矩形的左上角,矩形的高度为100 dp,宽度与包含父视图组的宽度相同

这样,您可以创建自动适应不同屏幕大小的马车标记。例如,如果使用相对布局,则在您的CACHAMECT活动中创建UI元素的虚拟视图,并告诉相对布局将教练标记放在虚拟视图下方,而高于窗口中间的解释文本框。这样,coachmark会自动获得正确的大小,以从文本框指向UI元素



希望这对别人有帮助

@GauravAgarwal噢。我漏了一步。我编辑了我的答案,以显示需要什么。谢谢,它现在可以工作了。如何在暂停的活动中绘制箭头并将其指向正确的坐标?@GauravAgarwal这确实是一个不同的问题。我建议在暂停内容活动之前,查找每个感兴趣区域的屏幕坐标(对于每个感兴趣的视图使用
getLocationInWindow
),并将这些坐标传递给启动覆盖活动的意图。您的覆盖活动将必须使用自定义主视图,该视图可以将这些坐标转换为箭头。我认为应该有其他的方法来实现这一点。你怎么能像问题图中所示的那样用箭头来纠正信息?我现在不明白你的问题。我已经看到它像一个屏幕与一些信息和录音这个屏幕应该关闭。你放在这个屏幕里的所有东西都是另一个问题,不是关于透明度。我的问题也是关于说明页,而不仅仅是透明度。最简单的一个问题是用所有信息和透明背景制作一个大图像。通过这种方式,您可能需要为每种类型的屏幕(即小型、中型和大型)设置屏幕。请澄清你的建议是什么?@PedroRainho是的,我在我的应用程序
Wordlist Builder
中尝试了其中一个。看看谷歌游戏?如果有用的话,我可以和你分享代码。嗨,你能告诉我你是怎么做到的吗?你能触摸一下半透明层后面的层吗?@user2078315不,你必须先去掉半透明层。@Shayanpourvatan将应用程序的源代码推送到Github。如果你需要我的关注,请在回购协议上留下评论。谢谢你发布这篇文章,效果很好。我遇到的唯一问题是styleable中的attr name=“color”,现在说它已经定义好了。显然,Android开发工具发生了一些变化。只是把它改成了“kolor”,效果很好。@Nantoka-我是个新手,我不知道在哪里添加这个,也不知道如何开始。你能帮帮我吗?@Bibhu-我可以画一个步骤的草图,但恐怕你必须自己尝试大致了解这个解决方案的细节。我们现在开始:1)创建一个具有半透明背景的新活动,如Ted Hopp的回答中所述2)将我的CoachmarkArrow类的源代码复制到src目录中3)将XML参数复制到res/values下的文件中4)使用CoachmarkArrow小部件设计UI布局或具有半透明背景的活动,如例4)有目的地开始活动,使其涵盖您进行的马车标记活动for@Nantoka-谢谢,我也这么做了,结果成功了。但我面临的一个问题是找出我想要指向的“按钮/控件”的位置。你能建议怎么做吗?@Bibhu-我用“试错法”来做这件事,因为用coachmarks替换原来的UI元素会非常复杂。并确保在具有不同显示尺寸的设备上测试您的设计,以确保箭头正好显示在您想要的位置。
<com.yourpackage.CoachmarkArrow
    xmlns:coachmark="http://schemas.android.com/apk/res/com.yourproject"    
    android:layout_height="100dp"
    android:layout_width="match_parent"
    coachmark:size="3dip"
    coachmark:color="@android:color/white"
    coachmark:from="bottomright"
    coachmark:to="topleft"
/>