如何通过setOutlineProvider实现阴影效果

avatar
作者
筋斗云
阅读量:0

在Android中,通过setOutlineProvider方法可以为视图(View)设置轮廓(Outline)提供者,从而实现阴影效果

  1. 首先,创建一个自定义的ViewOutlineProvider类,继承自ViewOutlineProvider
import android.graphics.Outline; import android.view.View; import android.view.ViewOutlineProvider;  public class CustomOutlineProvider extends ViewOutlineProvider {     private int width;     private int height;      public CustomOutlineProvider(int width, int height) {         this.width = width;         this.height = height;     }      @Override     public void getOutline(View view, Outline outline) {         outline.setRect(0, 0, width, height);     } } 
  1. 在布局文件中添加一个视图,例如TextView
    android:id="@+id/textView"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:text="Hello World!" /> 
  1. 在Activity或Fragment中,获取这个视图并设置OutlineProvider
import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity;  public class MainActivity extends AppCompatActivity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          TextView textView = findViewById(R.id.textView);         int width = textView.getWidth();         int height = textView.getHeight();          // 设置OutlineProvider         CustomOutlineProvider customOutlineProvider = new CustomOutlineProvider(width, height);         textView.setOutlineProvider(customOutlineProvider);          // 开启硬件加速         textView.setLayerType(View.LAYER_TYPE_HARDWARE, null);          // 设置阴影         textView.setElevation(8);     } } 

注意:在设置阴影之前,需要确保视图已经测量完成。可以在onCreate方法中使用ViewTreeObserver来监听视图的测量完成事件。

textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {     @Override     public void onGlobalLayout() {         // 获取视图的宽度和高度         int width = textView.getWidth();         int height = textView.getHeight();          // 设置OutlineProvider         CustomOutlineProvider customOutlineProvider = new CustomOutlineProvider(width, height);         textView.setOutlineProvider(customOutlineProvider);          // 开启硬件加速         textView.setLayerType(View.LAYER_TYPE_HARDWARE, null);          // 设置阴影         textView.setElevation(8);          // 移除监听器         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {             textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);         } else {             textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);         }     } }); 

这样,你就可以通过setOutlineProvider方法为视图设置阴影效果了。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!