侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Android 小技巧-1

Z同学
2020-09-09 / 0 评论 / 0 点赞 / 491 阅读 / 2,012 字
温馨提示:
本文最后更新于 2021-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

记录在开发之中,用到的小技巧,小配置属性。

本篇主要介绍:

1.动态修改drawable配置的shape颜色。

描述: 如果通过xml 进行绘制的颜色,我们在代码之中使用ColorFilter方法将无法进行动态替换颜色

解决:

 GradientDrawable myShape (GradientDrawable)view.getBackground();
myShape.setColor(0xffffff);

优势:colorFilter只有imageview 才有,而该方法 不限制imageView。所有的控件的Drawable 都可以替换。

2.viewPager 在一页之内,显示第二页部分。

描述: 添加的ViewPager的item。但是第二页显示不了

解决:
需要在xml布局之中添加

android:clipChildren="false"


完整例子:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:clipChildren="false"
   >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_margin="180dp"
        android:clipChildren="false"
        android:overScrollMode="never" />
</FrameLayout>
//请注意。margin的值一定要大于下面设置的pageMargin值。否则你看不到效果。
mViewPager.setPageMargin(20);  

3.绘制带半圆的按钮

解决:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:useLevel="true">
    <size
        android:width="50dp"
        android:height="20dp" />

    <solid android:color="@color/menu_bg" />
    <!-- 圆角半径是高度的一般就是一个圆弧了 -->
    <corners android:radius="100dp" />
</shape>

效果:
image.png

4.通过adb 命令快捷启动setting.APP

解决:

//将启动android系统设置界面
adb shell am start-activity -a android.settings.SETTINGS

5.自定义View 和SurfaceView 的区域刷新方法

自定义View 的区域刷新有两个地方需要注意
1.如果在onDraw之中有多个Bitmap对象需要刷新。那么可以采用clipOutRect()方法,将折叠隐藏的区域不进行绘制。

例如:
image.png
绘制速度按照先绘制A,再绘制B,最后绘制C

这个时候B会遮挡A的部分区域,C也会遮挡B的部分区域。

这些遮挡区域在View的onDraw方法之中我们可以通过clipOutRect方法给裁剪掉。

这样系统就可以节省部分的重构了。

2.如果只有一个Bitmap 产生了变化,然后重新显示的话,我们可以采用
解决:

//Rect 传递需要更新的区域,这样调用onDraw方法的时候将会只刷新该区域
invalidate(rect)

如果是自定义SurfaceDraw的话,那就更简单了。

//Rect 传递需要更新的区域,这样调用onDraw方法的时候将会只刷新该区域
holder.lockCanvas(rect)
0

评论区