[英]Android Spotlight Always on Corner point
與示例相同,但在我的項目中,聚光燈總是顯示在角落里,我該怎么辦? 或同一圖書館的任何優惠?
這是我的代碼
View one = findViewById(R.id.img_drawer);
int[] oneLocation = new int[2];
one.getLocationInWindow(oneLocation);
float oneX = oneLocation[0] + one.getWidth() / 2f;
float oneY = oneLocation[1] + one.getHeight() / 2f;
// make an target
SimpleTarget firstTarget = new SimpleTarget.Builder(TripActivity.this).setPoint(oneX, oneY)
.setRadius(100f)
.setTitle("first title")
.setDescription("first description")
.build();
Spotlight.with(TripActivity.this)
.setDuration(1000L)
.setAnimation(new DecelerateInterpolator(2f))
.setTargets(firstTarget)
.setOnSpotlightStartedListener(new OnSpotlightStartedListener() {
@Override
public void onStarted() {
Toast.makeText(TripActivity.this, "spotlight is started", Toast.LENGTH_SHORT)
.show();
}
})
.setOnSpotlightEndedListener(new OnSpotlightEndedListener() {
@Override
public void onEnded() {
Toast.makeText(TripActivity.this, "spotlight is ended", Toast.LENGTH_SHORT).show();
}
})
.start();
實際上,您的聚光燈目標是在目標視圖實際膨脹和創建之前創建的。 要解決此問題,您必須僅在視圖膨脹后創建聚光燈目標。
View one = findViewById(R.id.img_drawer);
int[] oneLocation = new int[2];
one.getLocationInWindow(oneLocation);
float oneX = oneLocation[0] + one.getWidth() / 2f;
float oneY = oneLocation[1] + one.getHeight() / 2f;
所以在上面的代碼示例中,oneX 和 oneY 變為 0,因此您的聚光燈目標移動到左上角,只有四分之一可見。
使用可以從任何視圖調用的 post 方法。 Post 方法采用一個可運行線程,並確保一旦視圖正確膨脹,此 post 可運行線程中的所有內容都會執行。
// create globally
SimpleTarget firstTarget = null;
// do this in onCreate of Activity or in onCreateView of Fragment
View one = findViewById(R.id.img_drawer);
one.post(new Runnable(){
@Override
public void run(){
int[] oneLocation = new int[2];
one.getLocationInWindow(oneLocation);
float oneX = oneLocation[0] + one.getWidth() / 2f;
float oneY = oneLocation[1] + one.getHeight() / 2f;
// make a target
firstTarget = new SimpleTarget.Builder(TripActivity.this)
.setPoint(oneX, oneY)
.setRadius(100f)
.setTitle("first title")
.setDescription("first description")
.build();
}
});
// Do this in onStart of Activity or in onViewCreated of Fragment
if (firstTarget != null)
Spotlight.with(TripActivity.this)
.setDuration(1000L)
.setAnimation(new DecelerateInterpolator(2f))
.setTargets(firstTarget)
.setOnSpotlightStartedListener(new OnSpotlightStartedListener() {
@Override
public void onStarted() {
Toast.makeText(TripActivity.this, "spotlight is started", Toast.LENGTH_SHORT).show();
}
})
.setOnSpotlightEndedListener(new OnSpotlightEndedListener() {
@Override
public void onEnded() {
Toast.makeText(TripActivity.this, "spotlight is ended", Toast.LENGTH_SHORT).show();
}
})
.start();
您的視圖尚未准備好,您必須在doOnPreDraw
調用它(我使用的是 core-ktx lib)
binding.root.doOnPreDraw {
showSpotlight() // call it here
}
這背后的原因是視圖(您要突出顯示的元素)尚未繪制到您的根布局中,而您正試圖在其上添加聚光燈。
下面的解決方案解決了我的問題。
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
SimpleTarget target = new SimpleTarget.Builder(activity)
.setPoint(view)
.setRadius(radius)
.setTitle(title)
.setDescription(description)
.build();
Spotlight.with(activity)
.setDuration(500L)
.setDuration(500L)
.setAnimation(new DecelerateInterpolator(1f))
.setTargets(target)
.setOnSpotlightStartedListener(new OnSpotlightStartedListener() {
@Override
public void onStarted() {
}
})
.setOnSpotlightEndedListener(new OnSpotlightEndedListener() {
@Override
public void onEnded() {
App.getLocalStorage().write(sharedPrefKey, true);
}
})
.start();
}
});
從您的 xml 文件中找到您的根布局,然后
rootlayout.post { // 編寫用於創建目標和聚光燈的代碼 }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.