在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!" />
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
方法为视图设置阴影效果了。