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