Basit bir soru, ama cevap bulamıyorum. CollapsingToolbarLayout
Programlı olarak nasıl daraltabilirim veya genişletebilirim ?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Basit bir soru, ama cevap bulamıyorum. CollapsingToolbarLayout
Programlı olarak nasıl daraltabilirim veya genişletebilirim ?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Yanıtlar:
Destek Kitaplığı v23'ü kullanarak arayabilirsiniz appBarLayout.setExpanded(true/false)
.
İlave okumalar: AppBarLayout.setExpanded (boolean)
Araç çubuğunu daraltmak için bu kodu kullanıyorum. Hala genişletmenin bir yolunu bulamıyorum.
public void collapseToolbar(){
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
behavior = (AppBarLayout.Behavior) params.getBehavior();
if(behavior!=null) {
behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true);
}
}
Düzenleme 1: Negatif hız Y ile aynı işlev ancak araç çubuğu% 100 genişletilmedi ve son parametre için yanlış çalışmalıdır
public void expandToolbar(){
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
behavior = (AppBarLayout.Behavior) params.getBehavior();
if(behavior!=null) {
behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false);
}
}
Edit 2: Bu kod benim için hile yapar
public void expandToolbar(){
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
behavior = (AppBarLayout.Behavior) params.getBehavior();
if(behavior!=null) {
behavior.setTopAndBottomOffset(0);
behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]);
}
}
Davranışı kendim uygulamaya çalışacağım.
onNestedFling
için false
.
onNestedFling
önce aramaya çalıştım . Parçayı ayarladıktan sonra yöntemi başarıyla çağırabilirim.
Özel animatörünüzle ne kadar genişleyeceğini veya daraltılacağını tanımlayabilirsiniz. Sadece setTopAndBottomOffset(int)
.
İşte bir örnek:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
ValueAnimator valueAnimator = ValueAnimator.ofInt();
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
appBar.requestLayout();
}
});
valueAnimator.setIntValues(0, -900);
valueAnimator.setDuration(400);
valueAnimator.start();
}
( -900 )
ayarlamak için valueAnimator.setIntValues
daha iyi bir çözüm olduğunu kullanmaktır- ( appBar.getTotalScrollRange() )
Küçük bir uzantı yazdım AppBarLayout
. CollapsibleToolbarLayout
Animasyonlu ve animasyonsuz ikisinin genişlemesine ve daraltılmasına izin verir . Oldukça doğru yapıyor gibi görünüyor.
Sadece yerine kullanın AppBarLayout
, ve genişletmek veya daraltmaktan sorumlu yöntemleri çağırabilirsiniz CollapsingToolbarLayout
.
Projemde tam olarak beklendiği gibi çalışıyor, ancak perform...
yöntemlerinizdeki (özellikle de performExpandingWithAnimation()
) fırlatma / kaydırma değerlerini mükemmel şekilde ayarlamanız gerekebilir CollapsibleToolbarLayout
.
setExpanded
yöntemi vardır AppBarLayout
.
mAppBarLayout.setExpanded(true)
Araç Çubuğunu genişletmek için kullanın ve Araç Çubuğunu mAppBarLayout.setExpanded(false)
daraltmak için kullanın .
CollapsingToolbarLayout yüksekliğini programlı olarak değiştirmek istiyorsanız mAppBarLayout.setLayoutParams(params)
;
Expand:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);
Çöküş:
CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
onNestedPreScroll ile çalışmak ve benim gibi hata almak isteyenler için. Bu çizgi ile onCreate içinde NullPointerException olsun
CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
//below line
params.setBehavior(new AppBarLayout.Behavior() {});
ve bununla düzgün çalışmıyor. ama ben bu soruna geçici bir çözüm bulmak
onCreate içinde:
scrollToolbarOnDelay();
ve...
public void scrollToolbarOnDelay() {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar);
CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if(behavior!=null)
behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0});
else
scrollToolbarOnDelay()
}
}, 100);
}
Bunu dene...
genişletmek
appBarLayout.setExpanded(true, true);
Hatırlamak için
appBarLayout.setExpanded(false, true);
Bu, genişletmeye veya daraltmaya yardımcı olabilir:
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);
bunu kullanıyorum
private fun collapseAppbar() {
scrollView.postDelayed(Runnable {
scrollView?.smoothScrollTo(50, 50)
}, 400)
}