原创:android模仿iphone 腾讯爱看文章列表放大缩小 带动画

产品一直拿着iphone app应用的效果,来强行让android实现同样的功能,android码农表示很悲催。

 

看效果:(以图片放大缩小为例)

          

 

package controls;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import Interface.ScalingChangeListener;
import android.os.Handler;
import android.view.View;
import android.widget.AbsListView;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class ScalingBig {
    
    private ScalingChangeListener changeListener;
    
    public ScalingChangeListener getChangeListener() {
        return changeListener;
    }

    public void setChangeListener(ScalingChangeListener changeListener) {
        this.changeListener = changeListener;
    }

    Handler handel = new Handler();
    int oldHeight=0;
    int newHeight=0;
    
    int currentHeight=0;
    
    int topMargin=0;//根View 可变
    int topHeight=0; //根view高度 不可变
    View rootView;
    View view;
    RelativeLayout.LayoutParams rowViewParams;
    RelativeLayout.LayoutParams rootViewParas;
    int topTime;//向上移动的次数
    int topStep;//向上移动每次的步长
    
    int timeHeight=100;//每次设置高度的步长
    
    public ScalingBig(View rootView,RelativeLayout.LayoutParams rootViewParas,
            View view,RelativeLayout.LayoutParams rowViewParams
            ,int topHeight,int oldHeight,int newHeight){
        this.view=view;
        this.oldHeight=oldHeight;
        this.currentHeight=oldHeight;
        
        this.newHeight=newHeight;
        this.rowViewParams = rowViewParams;
        this.rootViewParas=rootViewParas;
        this.rootView=rootView;
        
        this.topHeight=topHeight;
        
        topTime=(newHeight-oldHeight)%timeHeight==0?(newHeight-oldHeight)/timeHeight:(newHeight-oldHeight)/timeHeight+1;
        topStep=topHeight%topTime==0?topHeight/topTime:topHeight/topTime+1;
    }
    
    public void startScaling(){
        handel.post(run);
    }
    
    private Runnable run = new Runnable() {
        
        public void run() {
            if(rowViewParams.height>=newHeight){
                handel.removeCallbacks(run);
                if(changeListener!=null){
                    changeListener.finish();
                }
            }else{
                currentHeight=currentHeight+timeHeight;
                if(topHeight>0){
                    topMargin=topMargin+topStep;
                    if(topMargin>topHeight) topMargin=topHeight;
                    rootViewParas.topMargin=-topMargin;
                    rootView.requestLayout();
                    rootView.setLayoutParams(rootViewParas);
                }
                rowViewParams.height = currentHeight;
                System.out.println("currentHeight:"+currentHeight+" rootViewParas.topMargin:"+ -topMargin);
                //view.setLayoutParams(rowViewParams);
                view.requestLayout();
                handel.postDelayed(run, 1);
            }
        }
    };
}

 

package com.list;

import java.util.ArrayList;

import controls.ScalingBig;
import controls.ScalingSmall;
import Interface.ScalingChangeListener;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.AdapterView.OnItemClickListener;

public class ScaleViewActivity extends Activity implements View.OnClickListener{
    
    private ImageView img1;
    private ImageView img2;
    private ImageView img3;
    private ImageView img4;
    private ScrollView rootLayout;
    private enum ItemState{change,finish};
    
    private boolean[] listitemCheck=new boolean[4];
    private int[] listitemheight=new int[4];
    private ItemState[] listitemState=new ItemState[4];
    
    int ScreenHeight;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.scaleview);
        
        DisplayMetrics dm = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(dm);
        ScreenHeight = dm.heightPixels;
        
        
        img1=(ImageView)findViewById(R.id.img1);
        img2=(ImageView)findViewById(R.id.img2);
        img3=(ImageView)findViewById(R.id.img3);
        img4=(ImageView)findViewById(R.id.img4);
        rootLayout=(ScrollView)findViewById(R.id.rootLayout);
        
        for (int i = 0; i < 4; i++) {
            listitemCheck[i]=false;
            listitemheight[i]=0;
            listitemState[i]=ItemState.finish;
        }
        
        img1.setOnClickListener(this);
        img2.setOnClickListener(this);
        img3.setOnClickListener(this);
        img4.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        //Rect frame = new Rect();  
        
//getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
        
//int statusBarHeight = frame.top;  //状态栏高度
        ////ScreenHeight=ScreenHeight-statusBarHeight;
        
//ScreenHeight=frame.bottom-statusBarHeight;
        
        switch(v.getId()){
            case R.id.img1:
                if(listitemState[0]==ItemState.finish){
                    listitemState[0]=ItemState.change;
                    scaleImageView(img1,0,0);    
                }
                break;
            case R.id.img2:
                if(listitemState[1]==ItemState.finish){
                    listitemState[1]=ItemState.change;
                    scaleImageView(img2,1,img1.getHeight());    
                }
                break;
            case R.id.img3:
                if(listitemState[2]==ItemState.finish){
                    listitemState[2]=ItemState.change;
                    scaleImageView(img3,2,img1.getHeight()+img2.getHeight());    
                }
                break;
            case R.id.img4:
                if(listitemState[3]==ItemState.finish){
                    listitemState[3]=ItemState.change;
                    scaleImageView(img4,3,img1.getHeight()+img2.getHeight()+img3.getHeight());    
                }
                break;
        }
    }
    
    private void scaleImageView(ImageView img,int i,int topHeight){
        final int nIndex=i;
        RelativeLayout.LayoutParams rootViewParas=(RelativeLayout.LayoutParams)rootLayout.getLayoutParams();
        RelativeLayout.LayoutParams imgViewParams=(RelativeLayout.LayoutParams)img.getLayoutParams();
        int height=0;
        ScalingBig big=null;
        ScalingSmall small=null;        
        if(!listitemCheck[nIndex]==true){
            height=imgViewParams.height;
            listitemheight[nIndex]=height;
            listitemCheck[nIndex]=true;
            big=new ScalingBig(rootLayout,rootViewParas,img,imgViewParams,topHeight,height,ScreenHeight);
            big.setChangeListener(new ScalingChangeListener(){
                @Override
                public void finish() {
                    listitemState[nIndex]=ItemState.finish;
                }
            });
            big.startScaling();    
        }else{
            listitemCheck[nIndex]=false;
            small=new ScalingSmall(rootLayout,rootViewParas,img,imgViewParams,topHeight,ScreenHeight,
                    listitemheight[nIndex]);
            small.setChangeListener(new ScalingChangeListener(){
                @Override
                public void finish() {
                    listitemState[nIndex]=ItemState.finish;
                }
            });
            small.startScaling();    
        }
    }
}

 

 

 

源码:

/Files/neil-zhao/myScaleList.rar

 

posted on 2012-03-19 14:33  neil-zhao  阅读(2927)  评论(2编辑  收藏  举报

导航