流行的Google开发人员Romain Guy发了一篇很好的文章,展示了如何有效地在视图上使用圆角可绘制(在他的代码中称为"StreamDrawable" ).
在纵向模式下,样本本身在我的Galaxy S3上工作得非常好,但我有一些问题:
如果屏幕较小(例如在qvga屏幕上),则显示的图像会被裁剪.
如果我的输入位图太小而不是我希望显示的位置,则输出图像的边缘会被涂抹.即使在Galaxy S3上,当您运行示例代码并且它在横向上时,它看起来很糟糕:

我仍然不确定它(因为我使用缩放图像以使用示例代码的解决方法),但它认为即使这个解决方案在listView中使用时有点慢.也许这有一个renderscript解决方案?
如果我使用setImageDrawable或setBackgroundDrawable并不重要.它必须是drawable本身的东西.
我试过玩变量和bitmapShader,但没有任何效果.可悲的是,TileMode没有拉伸图像的值,只是以某种方式对其进行平铺.
作为一种解决方法,我可以创建一个新的缩放位图,但它只是一种解决方法.当然有一种更好的方法,也不会使用更多的内存.
如何解决这些问题并使用这个优秀的代码?
以下代码用于在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 …
我使用Brian Griffey提供的优秀要点(在此处找到),在Android 3.0+上成功构建了一个9patch drawable .
基本上我从网络加载原始(无补丁)图形文件,文件名包含我需要使用的上限,以便相应地缩放图像.然后我使用这些值与上面找到的类,并应用该图像作为背景的各种元件(如TextView,ImageButton,Button,ViewGroup,等等).
这可以完美地工作,你可以在这里看到:

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

我查看了Android中使用的源代码来解析9patch图像(此处和此处),但没有找到使其正常工作的方法.我已经尝试了几乎所有我可以抛出的东西都无济于事.
为了记录,9patch由每个轴上的三列组成,一个固定,一个可伸缩,一个固定.
这里希望别人之前解决过这个问题.
提前致谢.
编辑我只对在Android 2.3及更高版本上复制此行为感兴趣(我最初有2.x).
编辑#2这个要点准确描述了我正在尝试做的事情 +源图像:
编辑#3图像的大小为22px/58px(宽度/高度),插图为14/6/14/6(上/左/下/右).

<?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)
这是我尝试的代码,但它最终成为纯黑色.
我在可绘制文件夹中有一个高分辨率图像(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
我想在布局的右侧和底部添加一个光影.我尝试使用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) 在我的项目中,我有很多可绘制的内容,当我需要添加新图像以绘制时,我可以放置相同的资源,因为我忘了我已经拥有它.
它不是关于XML文件的预览,这很好用.
Android Studio中的任何功能都可以预览我的所有可绘制内容而无需双击每个资源?它可以节省大量时间.
我没有在偏好中找到任何东西,也许是一些插件或者我错过了什么?
Google日历应用有一个动作项,可根据当天("今天")动态更改:
我需要做一个非常相似的事情,但周围的文字略有不同.
通过创建一个包含文本和图像的Drawable(基于此处),我确实成功地使其工作.
但是,我认为我做得不够好:
下面是完整的代码(也可在此项目中的):
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) 我试过很多教程
但是没有得到正确的结果,任何人都可以帮助我获得完美的结果.
提前致谢.
我尝试用来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)
现在,
selectableItemBackgroundBorderless圆的效果是一个完美的圆.但是,它似乎有一些奇怪的行为.单击实际区域时ImageButton,不显示圆按效果.
我可以知道为什么会这样,我怎么能克服它?我使用API 26进行了测试.
注意,我试图避免使用TouchDelegate技术,除非我被迫,因为它使我们的代码更复杂.
以下是按钮显示的正确行为Toolbar.
当点击区域位于按钮外时,会显示波纹效果
当点击区域在按钮内时,会显示波纹效果
但是,我不知道他们是如何实现这种行为的.
android android-layout android-view android-drawable rippledrawable
android-drawable ×10
android ×9
drawable ×2
android-view ×1
bitmap ×1
bytearray ×1
gradient ×1
graphics ×1
nine-patch ×1
shape ×1