• 12.5 Tinting和Clipping" level="2">12.5 Tinting和Clipping
    • 12.5.1 Tinting(着色)" level="3">12.5.1 Tinting(着色)
    • 12.5.2 Clipping(裁剪)" level="3">12.5.2 Clipping(裁剪)

    12.5 Tinting和Clipping" class="reference-link">12.5 Tinting和Clipping

    Android 5.X在对图像的操作上有了更多的功能,下面来看看Android 5.X的两个对操作图像的新功能——Tinting(着色)和Clipping(裁剪)。

    12.5.1 Tinting(着色)" class="reference-link">12.5.1 Tinting(着色)

    本例依然拿最熟悉的Android小机器人开刀,牺牲一下它的形象来帮助大家理解什么是Tinting(着色)。

    Tinting的使用非常简单,只要在XML中配置好tint和tintMode就可以了。对于配置的组合效果,只需要大家实际操作一下,就能非常清楚地理解处理效果了,在下面的代码中,设置了几种不同的tint和tintMode来演示Tinting效果,XML代码如下所示。

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5.  
    6. android:orientation="vertical"
    7. tools:context=".MainActivity">
    8.  
    9. <ImageView
    10. android:layout_width="100dp"
    11. android:layout_height="100dp"
    12. android:elevation="5dip"
    13. android:layout_gravity="center"
    14. android:src="@drawable/ic_launcher" />
    15.  
    16. <ImageView
    17. android:layout_width="100dp"
    18. android:layout_height="100dp"
    19. android:elevation="5dip"
    20. android:layout_gravity="center"
    21. android:src="@drawable/ic_launcher"
    22. android:tint="@android:color/holo_blue_bright" />
    23.  
    24. <ImageView
    25. android:layout_width="100dp"
    26. android:layout_height="100dp"
    27. android:elevation="5dip"
    28. android:layout_gravity="center"
    29. android:src="@drawable/ic_launcher"
    30. android:tint="@android:color/holo_blue_bright"
    31. android:tintMode="add" />
    32.  
    33. <ImageView
    34. android:layout_width="100dp"
    35. android:layout_height="100dp"
    36. android:elevation="5dip"
    37. android:layout_gravity="center"
    38. android:src="@drawable/ic_launcher"
    39. android:tint="@android:color/holo_blue_bright"
    40.  
    41. android:tintMode="multiply" />
    42.  
    43. </LinearLayout>

    效果如图12.10所示。

    12.5 Tinting和Clipping - 图1 图12.10 Tint

    Tint通过修改图像的Alpha遮罩来修改图像的颜色,从而达到重新着色的目的。这一功能在一些图像处理App中使用起来将非常方便。

    12.5.2 Clipping(裁剪)" class="reference-link">12.5.2 Clipping(裁剪)

    Clipping可以让我们改变一个视图的外形。要使用Clipping ,首先需要使用ViewOutlineProvider来修改outline,然后再通过setOutlineProvider将outline作用给视图。

    在下面这个例子中,将一个正方形的TextView通过Clipping裁剪成了一个圆角正方形和一个圆,以此来帮助大家理解Clipping的使用思路,XML代码如下所示。

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical"
    6. tools:context=".MainActivity">
    7.  
    8. <TextView
    9. android:id="@+id/tv_rect"
    10. android:layout_marginTop="20dp"
    11. android:layout_width="100dp"
    12. android:layout_height="100dp"
    13. android:elevation="1dip"
    14. android:layout_gravity="center" />
    15.  
    16. <TextView
    17. android:id="@+id/tv_circle"
    18. android:layout_width="100dp"
    19. android:layout_height="100dp"
    20. android:elevation="1dip"
    21. android:layout_gravity="center" />
    22.  
    23. </LinearLayout>

    程序代码如下所示。

    1. package com.xys.myapplication;
    2.  
    3. import android.app.Activity;
    4. import android.graphics.Outline;
    5. import android.os.Bundle;
    6. import android.view.View;
    7. import android.view.ViewOutlineProvider;
    8.  
    9. public class MainActivity extends Activity {
    10.  
    11. @Override
    12. protected void onCreate(Bundle savedInstanceState) {
    13. super.onCreate(savedInstanceState);
    14. setContentView(R.layout.activity_main);
    15. View v1 = findViewById(R.id.tv_rect);
    16. View v2 = findViewById(R.id.tv_circle);
    17. //获取Outline
    18. ViewOutlineProvider viewOutlineProvider1 =
    19. new ViewOutlineProvider() {
    20.  
    21. @Override
    22. public void getOutline(View view, Outline outline) {
    23. //修改outline为特定形状
    24. outline.setRoundRect(0, 0,
    25. view.getWidth(),
    26. view.getHeight(), 30);
    27. }
    28. };
    29. //获取Outline
    30. ViewOutlineProvider viewOutlineProvider2 =
    31. new ViewOutlineProvider() {
    32. @Override
    33. public void getOutline(View view, Outline outline) {
    34. //修改outline为特定形状
    35. outline.setOval(0, 0,
    36. view.getWidth(),
    37. view.getHeight());
    38. }
    39. };
    40. //重新设置形状
    41. v1.setOutlineProvider(viewOutlineProvider1);
    42. v2.setOutlineProvider(viewOutlineProvider2);
    43. }
    44. }

    效果如图12.11所示。

    12.5 Tinting和Clipping - 图2 图12.11 Clipping效果