十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇文章為大家展示了使用HorizontalScrollView怎么實現(xiàn)滑動頁面時的縮放效果,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

創(chuàng)新互聯(lián)建站專注于德陽網(wǎng)站建設(shè)服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供德陽營銷型網(wǎng)站建設(shè),德陽網(wǎng)站制作、德陽網(wǎng)頁設(shè)計、德陽網(wǎng)站官網(wǎng)定制、成都微信小程序服務,打造德陽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供德陽網(wǎng)站排名全網(wǎng)營銷落地服務。
activity_main.xml :
在 item.xml 布局文件的右邊有個 button 按鈕,這些都在 HorizontalScrollView 的子組件當中。而 item.xml 究竟是怎樣的布局也都不會影響到整個的滑動。
item.xml :
MainActivity.java :
package com.crazy.reduce;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
private ReduceSideslip rs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rs = (ReduceSideslip)findViewById(R.id.reduce_lay);
}
public void toggleMenu(View v) {
rs.reduce();
}
}自定義的 ReduceSideslip.java : 需要 nineoldandroids-2.4.0.jar 包,其下載地址
package com.crazy.reduce;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import com.nineoldandroids.view.ViewHelper;
public class ReduceSideslip extends HorizontalScrollView {
private int mScreenWidth; // 屏幕寬度
private int mMnuRightPadding = 300;
private int mMenuWidth; // 視圖寬度(左邊的視圖)
private int mHalfMenuWidth;
private boolean isOpen; // 標記菜單是否打開
private boolean once; // 是否已經(jīng)初始化回收菜單
private ViewGroup mMenu; // 左邊的視圖
private ViewGroup mContent; // 右邊的視圖
public ReduceSideslip(Context context, AttributeSet attrs) {
super(context, attrs);
mScreenWidth = context.getResources().getDisplayMetrics().widthPixels;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (!once) {
// 要與布局文件當中的一致
LinearLayout temp = (LinearLayout)getChildAt(0);
mMenu = (ViewGroup)temp.getChildAt(0);
mContent = (ViewGroup)temp.getChildAt(1);
mMenuWidth = mScreenWidth - mMnuRightPadding;
mHalfMenuWidth = mMenuWidth/2;
mMenu.getLayoutParams().width = mMenuWidth;
mContent.getLayoutParams().width = mScreenWidth;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
// 在視圖計算完自身及子視圖的寬高后,重新排版
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (changed) {
// 隱藏菜單
this.scrollTo(mMenuWidth, 0);
once = true;
}
}
public void reduce(){
if (isOpen) {
closeMenu();
} else {
openMenu();
}
}
private void openMenu() {
if (isOpen) {
return;
}
// 和 scrollTo() 相似,但是要緩和些,
// 不像 scrollTo() 直接移動過去
this.smoothScrollTo(0, 0);
isOpen = true;
}
private void closeMenu() {
if (isOpen) {
this.smoothScrollTo(mMenuWidth, 0);
isOpen = false;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_UP: // 松開手
int scrollX = getScrollX(); // 水平滑動的距離
if (scrollX > mHalfMenuWidth) {
this.smoothScrollTo(mMenuWidth, 0);
isOpen = false;
} else {
this.smoothScrollTo(0, 0);
isOpen = true;
}
return true;
}
return super.onTouchEvent(ev);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
// 左右視圖切換時的漸變范圍 (注意是 l 不是1(一))
float scale = l*1.0f/mMenuWidth; // 范圍值 (0, 1)
float leftScale = 1- 0.3f*scale; // 范圍值(0.7, 1)
float rightScale = 0.8f + 0.2f*scale; // 范圍值 (0.8, 1)
ViewHelper.setScaleX(mMenu, leftScale);
ViewHelper.setScaleY(mMenu, leftScale);
// 往右滑動時,左邊的視圖逐漸變亮
ViewHelper.setAlpha(mMenu, 0.6f + 0.4f * (1 - scale)); // (0.6, 1)
// 往左滑動時,左邊的視圖不用移除屏幕左邊界(可以不要)
ViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.7f);
ViewHelper.setScaleX(mContent, rightScale);
ViewHelper.setScaleY(mContent, rightScale);
}
}上述內(nèi)容就是使用HorizontalScrollView怎么實現(xiàn)滑動頁面時的縮放效果,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。