标签: porter-duff

如何在Android中用XML创建"矩形内部透明圆"形状?

我正在尝试在我的应用中创建以下设计.

设计样机
(https://photos.google.com/share/AF1QipPhCGTgf9zi7MetWJYm0NQ14c3wqzjqnEwxsajCFHEjqzt5R29qYvIjZ2C71q7EnQ?key=WUZKSXA1WVVwSlI2LVdTQy1IRjdUdzVuQlpCY0Rn)

它是主UI上面的叠加层.尝试使用主UI顶部的布局创建它,其背景为以XML创建的半透明形状.然而,即使阅读了多篇文章,我也无法弄明白.

我尝试了以下方法,但它没有用.创建一个200dp笔划的环形,并将其设置为imageview的源,然后将scaletype设置为centerCrop,但形状不像位图那样缩放.

形状XML:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:innerRadius="0dp"
    android:shape="ring"
    android:thicknessRatio="2"
    android:useLevel="false" >

    <solid android:color="@android:color/transparent" />

    <stroke
        android:width="200dp"
        android:color="#80000000" />
</shape>
Run Code Online (Sandbox Code Playgroud)

叠加布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/onboarding_background"
        android:scaleType="centerCrop"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

有关如何执行此操作或代码的任何指示都非常有用.

android porter-duff

11
推荐指数
1
解决办法
8212
查看次数

将两个图像与乘法和%不透明度混合在一起

我正在尝试使用类似Multiply的混合模式将两个图像与Android混合在一起.

// Prepare -------------------------------

// Create source images
Bitmap img1 = ...
Bitmap img2 = ...

// Create result image
Bitmap result = ...
Canvas canvas = new Canvas();
canvas.setBitmap(result);

// Get proper display reference
BitmapDrawable drawable = new BitmapDrawable(getResources(), result);
ImageView imageView = (ImageView)findViewById(R.id.imageBlend1);
imageView.setImageDrawable(drawable);


// Apply -------------------------------

// Draw base
canvas.drawBitmap(img1, 0, 0, null);

// Draw overlay
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(Mode.MULTIPLY));
paint.setShader(new BitmapShader(img2, TileMode.CLAMP, TileMode.CLAMP));

canvas.drawRect(0, 0, img2.getWidth(), img2.getHeight(), paint);
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是我无法控制所做的乘法"量" - 它始终是一个完全的乘法传递.理想情况下,0%乘法与基本图像(img1)相同而没有任何变化,但100%乘法将是我得到的上述代码的结果.

paint.setAlpha() 似乎不适用于此. …

android blending porter-duff

9
推荐指数
1
解决办法
1万
查看次数

如何在没有内存耗尽的情况下在机器人中制作拼图应用程序?

我注意到来自谷歌游戏商店的其他拼图应用程序可以达到多达400个单独的可移动拼图

我一直试图学习如何至少拍摄一个代表我的谜题的图像,裁剪某些部分并遮盖留下拼图设计的图像空间,以便创建我个人的拼图

我想为我的应用程序最多20件,但到目前为止,根据我的android工作室内存日志,一旦位图工厂完成创建一个拼图块我用尽了大约18mb的内存,之后创建了20件与所有其他应用程序的功能我正在使用400 + mb的内存,我必须使用"largeHeap = true"以防止内存耗尽,但我已经接近超出应用程序超级缓慢且足够的限制动画活动将不可避免地导致应用程序崩溃

我很想知道那些其他游戏商店拼图应用程序正在做什么,我不是

非常感谢任何输入

仅供我使用PNG24作为我的图像,测试图像的尺寸为556x720

这是一个例子,如果我只是创建一个动画能力拼图图像

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);//Remove title bar
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//Hides notification bar
    this.setContentView(R.layout.activity_main);//set content view AFTER ABOVE sequence (to avoid crash)

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    mainDisplay = getWindowManager().getDefaultDisplay();
    mainLayout = (ViewGroup) findViewById(R.id.id_layout);

    DisplayMetrics m = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics(m);
    int windowHeight = m.heightPixels;
    int windowWidth = m.widthPixels;

    offsetX = (windowWidth / 1440.0f);
    offsetY = (windowHeight / 2560.0f);

    ourContext = this;

    xpos = new float[2];
    ypos = new float[2];

    iv_PuzzleOne();

    bkgdbm = …
Run Code Online (Sandbox Code Playgroud)

puzzle android crop porter-duff android-bitmap

9
推荐指数
1
解决办法
403
查看次数

Android自定义XferMode/PorterDuff.Mode

这里描述了一些预定义的混合模式:https://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

是否有可能使用其他一些自定义模式?(用于在Canvas上绘制各种内容)

例如,我真的需要两个:

  • 替换alpha(它会被写成[Sa, Dc]好像我理解的那样)
  • 混合使用目标alpha [Sa, Da * Sc + (1 - Da) * Dc](这里我真的不关心结果的alpha)

如果需要OpenGL ES 2+,那就没关系了.

这里有一个[远程]类似的问题:在android中实现不同的PorterDuff模式 - 但答案似乎需要使用两个位图,我想保持不受临时位图的影响,因为它们......不是免费的.

android opengl-es porter-duff

8
推荐指数
0
解决办法
730
查看次数

Android颜色叠加 - PorterDuff模式

我有一个黑色和白色九色可绘制作为视图的背景,我想在它上面应用一种颜色,就像一个半透明的覆盖层,使图形可见,但在其上应用所需的颜色.

我认为drawable.setColorFilter(color,mode)可能会做到这一点,但我无法弄清楚不同的模式意味着什么.

谁能给我一个提示?

android colorfilter porter-duff

7
推荐指数
1
解决办法
1万
查看次数

强光、柔光、颜色减淡、颜色烧伤的混合模式公式?

我正在尝试为 CSS 实现穷人的混合模式,期待浏览器推出支持。(我使用的 CSS 预处理器是 Stylus,这对讨论并不重要。)我从 W3C SVG 规范中找到了混合模式计算的来源,但某些方程给出的结果与预期的结果大不相同 -具体来说,hard-lightsoft-lightcolor-dodgecolor-burn

有谁知道有关混合模式的更正确、更可靠的公式?我将每种颜色的 RGB 通道预乘以它们的 Alpha。

这是我到目前为止所得到的。 https://github.com/pdaoust/stylus-helpers/blob/master/blend.styl

graphics alphablending porter-duff

7
推荐指数
1
解决办法
9009
查看次数

如何在Bitmap周围创建浮雕?

流行游戏Words with Friends在游戏板上绘制字母拼贴作为单个实体 -

您可以在以下屏幕截图中看到应用于所有字母图块的黄色线性渐变,以及边缘上的浮雕效果:

应用截图

我的文字游戏中,我希望有类似的效果:

浮雕的例子

所以我创建了一个游戏板大小mBitmap,然后将所有图块绘制到其中,最后将位图绘制到我的自定义视图中 -

建立:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

// create yellow linear gradient
mGradStart = new Point(3 * mWidth / 4, mHeight / 3);
mGradEnd = new Point(mWidth / 4, 2 * mHeight / 3);
LinearGradient gradient = new LinearGradient(
        mGradStart.x,
        mGradStart.y,
        mGradEnd.x,
        mGradEnd.y,
        new int[]{ 0xCCFFCC00, 0xCCFFCC99, 0xCCFFCC00 },
        null,
        TileMode.CLAMP);

// create the big bitmap holding all tiles
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mCanvas = …
Run Code Online (Sandbox Code Playgroud)

android bitmap emboss porter-duff android-bitmap

7
推荐指数
1
解决办法
1409
查看次数

使用蒙版显示带有2种不同颜色的TextView

我试图达到类似这个的效果:

在此输入图像描述

我现在在做什么:

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

    p = new Paint(Paint.ANTI_ALIAS_FLAG);
    p.setTextSize(25);
    p.setColor(Color.GREEN);

    pReplace = new Paint(p);
    pReplace.setColor(Color.BLUE);
    pReplace.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));

    pMask = new Paint();
    int lightGradientColor = getResources().getColor(R.color.dailyGoalLowLight);
    int darkGradientColor = getResources().getColor(R.color.dailyGoalLowDark);
    Shader shader = new LinearGradient(0, 0, 150, 0, lightGradientColor, darkGradientColor, Shader.TileMode.CLAMP);
    pMask.setShader(shader);
    pMask.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    if (!Utils.isEmpty(sText)) {
        canvas.drawText(sText, 150, getHeight() / 2, p);
        canvas.drawRect(0, 0, 180, getHeight(), pMask);
        canvas.drawText(sText, 150, getHeight()/2, pReplace);
    }
    canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)

这导致: …

android android-custom-view porter-duff android-view android-paint

7
推荐指数
1
解决办法
344
查看次数

Jetpack Compose 将 PorterDuffMode 应用于图像

基于本页中的图像和 PorterDuffModes

我下载了图像,最初即使它们是png,它们也有浅灰色和深灰色的矩形,这些矩形不透明并删除了它们。

目的地 来源

并使用此示例代码进行检查,将原始代码中的可绘制对象替换为下面的可绘制对象,我得到结果

在此输入图像描述

看起来它可以与 Android View 一起使用,但是当我使用 Jetpack Canvas 作为

androidx.compose.foundation.Canvas(modifier = Modifier.size(500.dp),
    onDraw = {

        drawImage(imageBitmapDst)
        drawImage(imageBitmapSrc, blendMode = BlendMode.SrcIn)

    })
Run Code Online (Sandbox Code Playgroud)

BlendMode.SrcIn 在黑色矩形上绘制蓝色矩形,其他模式也不会返回正确的结果。BlendMode.SrcOut 返回黑屏。

并使用 2 张图像堆叠在一起Box

val imageBitmapSrc: ImageBitmap = imageResource(id = R.drawable.c_src)
val imageBitmapDst: ImageBitmap = imageResource(id = R.drawable.c_dst)

Box {
    Image(bitmap = imageBitmapSrc)
    Image(
        bitmap = imageBitmapDst,
        colorFilter = ColorFilter(color = Color.Unspecified, blendMode = BlendMode.SrcOut)
    )
}
Run Code Online (Sandbox Code Playgroud)

仅蓝色 src 矩形可见。

也尝试过Painter,但也无法使其工作

val imageBitmapSrc: ImageBitmap = imageResource(id = R.drawable.c_src) …
Run Code Online (Sandbox Code Playgroud)

android canvas porter-duff android-jetpack-compose

7
推荐指数
2
解决办法
5091
查看次数

如何使用另一个位图作为掩码绘制位图?

我想使用另一个位图作为掩码绘制位图.掩码是一个黑色位图,其中包含透明对象.我希望这个透明部分填充任意颜色并添加到我的原始图像.如何才能做到这一点?

在此输入图像描述

+

在此输入图像描述

+蓝色=

在此输入图像描述

android mask porter-duff

6
推荐指数
1
解决办法
6081
查看次数