标签: android-drawable

使用圆角可绘制

流行的Google开发人员Romain Guy发了一篇很好的文章,展示了如何有效地在视图上使用圆角可绘制(在他的代码中称为"StreamDrawable" ).

在纵向模式下,样本本身在我的Galaxy S3上工作得非常好,但我有一些问题:

  1. 如果屏幕较小(例如在qvga屏幕上),则显示的图像会被裁剪.

  2. 如果我的输入位图太小而不是我希望显示的位置,则输出图像的边缘会被涂抹.即使在Galaxy S3上,当您运行示例代码并且它在横向上时,它看起来很糟糕:

    在此输入图像描述

  3. 我仍然不确定它(因为我使用缩放图像以使用示例代码的解决方法),但它认为即使这个解决方案在listView中使用时有点慢.也许这有一个renderscript解决方案?

如果我使用setImageDrawable或setBackgroundDrawable并不重要.它必须是drawable本身的东西.

我试过玩变量和bitmapShader,但没有任何效果.可悲的是,TileMode没有拉伸图像的值,只是以某种方式对其进行平铺.

作为一种解决方法,我可以创建一个新的缩放位图,但它只是一种解决方法.当然有一种更好的方法,也不会使用更多的内存.

如何解决这些问题并使用这个优秀的代码?

android rounded-corners android-drawable

13
推荐指数
1
解决办法
4888
查看次数

具有可绘制背景的自定义按钮:Android 4与Android 2.3中的填充差异

以下代码用于在Android中显示自定义按钮.不幸的是,这些不同位置的所有填充值都会影响按钮仅针对Android 2.3呈现的方式,但是在Android 4.X上它没有任何效果,即填充总是相同的,无论您在此处设置什么.为什么?

布局XML:

<Button
    android:id="@+id/sample_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_caption"
    android:padding="6dp"
    android:layout_marginBottom="6dp"
    android:layout_marginRight="6dp"
    style="@style/CustomButton"
    android:textSize="16sp" />
Run Code Online (Sandbox Code Playgroud)

风格:

<style name="CustomButton">
    <item name="android:layout_gravity">center_horizontal</item>
    <item name="android:padding">6dp</item>
    <item name="android:background">@drawable/custom_button</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:gravity">center</item>
    <item name="android:textStyle">bold</item>
</style>
Run Code Online (Sandbox Code Playgroud)

可绘制的:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape>
            <solid
                android:color="#60ff0000" />
            <stroke
                android:width="1dp"
                android:color="#ffffff" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="6dp"
                android:top="6dp"
                android:right="6dp"
                android:bottom="6dp" />
        </shape>
    </item>
    <item>
        <shape>
            <solid
                android:color="#90ff0000" />
            <stroke
                android:width="1dp"
                android:color="#ffffff" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="6dp"
                android:top="6dp"
                android:right="6dp"
                android:bottom="6dp" />
        </shape>
    </item>
</selector>
Run Code Online (Sandbox Code Playgroud)

当我将所有这些填充值设置为较小的值(如2)时,按钮在Android …

android android-layout android-drawable

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

在运行时构建9个可绘制的补丁

我使用Brian Griffey提供的优秀要点(在此处找到),在Android 3.0+上成功构建了一个9patch drawable .

基本上我从网络加载原始(无补丁)图形文件,文件名包含我需要使用的上限,以便相应地缩放图像.然后我使用这些值与上面找到的类,并应用该图像作为背景的各种元件(如TextView,ImageButton,Button,ViewGroup,等等).

这可以完美地工作,你可以在这里看到:

Android 3.0+结果

但是,在Android 2.3.x上运行相同的代码会产生结果:

Android 2.x结果

我查看了Android中使用的源代码来解析9patch图像(此处此处),但没有找到使其正常工作的方法.我已经尝试了几乎所有我可以抛出的东西都无济于事.

为了记录,9patch由每个轴上的三列组成,一个固定,一个可伸缩,一个固定.

这里希望别人之前解决过这个问题.

提前致谢.

编辑我只对在Android 2.3及更高版本上复制此行为感兴趣(我最初有2.x).

编辑#2这个要点准确描述了我正在尝试做的事情 +源图像:源图像

编辑#3图像的大小为22px/58px(宽度/高度),插图为14/6/14/6(上/左/下/右).

graphics android bytearray nine-patch android-drawable

13
推荐指数
2
解决办法
4855
查看次数

透明黑色渐变形状可绘制颜色代码

视图寻呼机指示器的渐变

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient 
        android:startColor="#000"
        android:centerColor="#00000000"
        android:endColor="#000"
        android:angle="270"
        android:dither="true"
     />
</shape>
Run Code Online (Sandbox Code Playgroud)

这是我尝试的代码,但它最终成为纯黑色.

android gradient shape android-drawable

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

为什么我没有内存不足的例外?

我在可绘制文件夹中有一个高分辨率图像(2588*1603).如果我使用下面的代码(1)为imageView设置它我没有得到OOM异常和按预期分配的图像:

public class MainActivity extends ActionBarActivity{


    private ImageView mImageView;

    int mImageHeight = 0;
    int mImageWidth  = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

      mImageView = (ImageView) findViewById(R.id.imageView);
      mImageView.setScaleType(ScaleType.FIT_CENTER);

      BitmapFactory.Options sizeOption = new BitmapFactory.Options();
      sizeOption.inJustDecodeBounds = true;
      BitmapFactory.decodeResource(getResources(), R.drawable.a, sizeOption);
      mImageHeight = sizeOption.outHeight;
      mImageWidth  = sizeOption.outWidth; 

      mImageView.post(new Runnable() {
          @Override
          public void run() {
              try {
                BitmapRegionDecoder bmpDecoder = BitmapRegionDecoder
                          .newInstance(getResources().openRawResource(R.drawable.a),true);
            Rect rect = new Rect(0,0,mImageWidth, mImageHeight);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            options.inDensity = getResources().getDisplayMetrics().densityDpi;
            Bitmap …
Run Code Online (Sandbox Code Playgroud)

android bitmap out-of-memory android-drawable bitmapregiondecoder

13
推荐指数
1
解决办法
606
查看次数

在布局的右侧和底部添加阴影

我想在布局的右侧和底部添加一个光影.我尝试使用android:background="@android:drawable/dialog_holo_light_frame"但是它在布局的所有四个边上都添加了一个厚阴影.我需要创建哪些可绘制并设置为背景?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@android:drawable/dialog_holo_light_frame">
       <ImageView
                android:id="@+id/g"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:scaleType="centerCrop"
                android:layout_gravity="center"
                android:src="@drawable/logo_icon"
                android:visibility="visible"
                android:clickable="true" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

android drawable android-layout android-drawable

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

在Android Studio中显示所有可绘制内容

在我的项目中,我有很多可绘制的内容,当我需要添加新图像以绘制时,我可以放置相同的资源,因为我忘了我已经拥有它.

不是关于XML文件的预览,这很好用.

Android Studio中的任何功能都可以预览我的所有可绘制内容而无需双击每个资源?它可以节省大量时间.

我没有在偏好中找到任何东西,也许是一些插件或者我错过了什么?

在此输入图像描述

drawable android-drawable android-studio

13
推荐指数
2
解决办法
2920
查看次数

如何在其中添加动态文字的图片,所有图片都是可绘制的,例如Google日历应用中的"今天"操作项?

背景

Google日历应用有一个动作项,可根据当天("今天")动态更改:

在此输入图像描述

我需要做一个非常相似的事情,但周围的文字略有不同.

问题

通过创建一个包含文本和图像的Drawable(基于此处),我确实成功地使其工作.

但是,我认为我做得不够好:

  1. 文本字体可能因设备而异,因此可能不适合我写的内容.
  2. 不确定是不是因为VectorDrawable或文本,但我认为文本看起来并不那么集中.看起来有点左边.如果我使用2位数,则尤其如此:

在此输入图像描述

  1. 对于垂直居中,我认为我没有做正确的计算.我在那里尝试了更多合乎逻辑的东西,但它们没有集中.

我试过的

下面是完整的代码(也可在此项目中的):

TextDrawable.java

public class TextDrawable extends Drawable {
    private static final int DEFAULT_COLOR = Color.WHITE;
    private static final int DRAWABLE_SIZE = 24;
    private static final int DEFAULT_TEXT_SIZE = 8;
    private Paint mPaint;
    private CharSequence mText;
    private final int mIntrinstSize;
    private final Drawable mDrawable;

    public TextDrawable(Context context, CharSequence text) {
        mText = text;
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(DEFAULT_COLOR);
        mPaint.setTextAlign(Align.CENTER);
        float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_TEXT_SIZE, context.getResources().getDisplayMetrics());
        mPaint.setTextSize(textSize);
        mIntrinstSize …
Run Code Online (Sandbox Code Playgroud)

android android-drawable android-toolbar

13
推荐指数
1
解决办法
1117
查看次数

自定义按钮背景有对角切口视图

我想设置背景,如图所示 在此输入图像描述

我试过很多教程

但是没有得到正确的结果,任何人都可以帮助我获得完美的结果.

提前致谢.

android android-canvas android-drawable

13
推荐指数
1
解决办法
961
查看次数

实现工具栏菜单项单击涟漪效果

我尝试用来padding增加按钮的触摸区域.我用

<ImageButton
    android:paddingRight="32dp"
    android:paddingEnd="32dp"
    android:id="@+id/confirm_image_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:background="?selectableItemBackgroundBorderless"
    android:src="?attr/confirmIcon" />
Run Code Online (Sandbox Code Playgroud)

点击区域是放大的.但是,selectableItemBackgroundBorderless点击效果不再显示为完美的圆圈.

在此输入图像描述


我尝试用duplicateParentState技术来克服.

<FrameLayout
    android:clickable="true"
    android:paddingRight="32dp"
    android:paddingEnd="32dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true">
    <ImageButton
        android:duplicateParentState="true"
        android:id="@+id/confirm_image_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="?selectableItemBackgroundBorderless"
        android:src="?attr/confirmIcon" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在,

  1. 点击区域被放大.
  2. selectableItemBackgroundBorderless圆的效果是一个完美的圆.

但是,它似乎有一些奇怪的行为.单击实际区域时ImageButton,不显示圆按效果.

在此输入图像描述

我可以知道为什么会这样,我怎么能克服它?我使用API​​ 26进行了测试.

注意,我试图避免使用TouchDelegate技术,除非我被迫,因为它使我们的代码更复杂.


附加信息

以下是按钮显示的正确行为Toolbar.

当点击区域位于按钮外时,会显示波纹效果

在此输入图像描述

当点击区域在按钮内时,会显示波纹效果

在此输入图像描述

但是,我不知道他们是如何实现这种行为的.

android android-layout android-view android-drawable rippledrawable

13
推荐指数
1
解决办法
3006
查看次数