在Android中,通过setOutlineProvider
方法可以为视图(View)设置轮廓(Outline)提供者,从而实现阴影效果
- 首先,创建一个自定义的
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); } }
- 在布局文件中添加一个视图,例如
TextView
。
android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" />
- 在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
方法为视图设置阴影效果了。