/**
* 中点的Y坐标
*/
private float centerY = 0f;
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//计算中点
centerY = getHeight()/2;
//判断中点的有效性
if(centerY <= 0){
return;
}
//开始对当前显示的View进行缩放
for(int i = 0; i < visibleItemCount; i++){
//获取item
View temp_view = getChildAt(i);
//计算item的中点Y坐标
float itemY = temp_view.getBottom()-(temp_view.getHeight()/2);
//计算离中点的距离
float distance = centerY;
if(itemY > centerY){
distance = itemY - centerY;
}else{
distance = centerY - itemY;
}
//根据距离进行缩放
temp_view.setScaleY(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
temp_view.setScaleX(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
//根据距离改变透明度
temp_view.setAlpha(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
}
}
/**
* 模仿滚轮动画缩放的ListView
* Created by xu on 2017/3/3.
*/
public class XuListView extends ListView implements AbsListView.OnScrollListener {
private static final String TAG = "XuListView";
/**
* 中点的Y坐标
*/
private float centerY = 0f;
public XuListView(Context context, AttributeSet attrs) {
super(context, attrs);
//设置一个滚动监听
setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//计算中点
centerY = getHeight()/2;
//判断中点的有效性
if(centerY <= 0){
return;
}
//开始对当前显示的View进行缩放
for(int i = 0; i < visibleItemCount; i++){
//获取item
View temp_view = getChildAt(i);
//计算item的中点Y坐标
float itemY = temp_view.getBottom()-(temp_view.getHeight()/2);
//计算离中点的距离
float distance = centerY;
if(itemY > centerY){
distance = itemY - centerY;
}else{
distance = centerY - itemY;
}
//根据距离进行缩放
temp_view.setScaleY(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
temp_view.setScaleX(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
//根据距离改变透明度
temp_view.setAlpha(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
}
}
}
public class MainActivity extends AppCompatActivity {
XuListView mLisetview;
MyAdapter adapter;
ArrayList<String> nos = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLisetview = (XuListView) findViewById(R.id.list_test);
ArrayList<String> temp = new ArrayList<String>();
for(int i = 0;i<10;i++){
temp.add(i+"");
}
adapter = new MyAdapter(this,temp);
mLisetview.setAdapter(adapter);
resetitem(mLisetview);
}
/**
* 在头尾填充透明的item数据
*/
private void resetitem(ListView listview) {
if(listview == null){
return;
}
//获取屏幕高度
WindowManager wm =getWindowManager();
int displayheight = wm.getDefaultDisplay().getHeight();
//计算一个item的高度
int itemhight = 0;
if(adapter!=null){
View v=(View)adapter.getView(0, null, listview);
v.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
itemhight=v.getMeasuredHeight();
}
//根据Item的高度和屏幕的高度计算需要多少个item可以填满一半的屏幕
int newcount = ((displayheight/2)/itemhight);
//填充前面的空白item
for (int i = 1; i <= newcount; i++) {
nos.add("full");
}
//添加我们需要显示的数据
for(int i = 0;i<10;i++){
nos.add(i+"");
}
//填充后面的空白item
for (int i = 1; i <= newcount; i++) {
nos.add("full");
}
//刷新数据
adapter.refreshData(nos);
}
}
public class MyAdapter extends BaseAdapter {
ArrayList<String> nos = new ArrayList<String>();
private Context context;
public MyAdapter(Context context, ArrayList<String> nos){
this.context = context;
this.nos = nos;
}
public void refreshData(ArrayList<String> nos) {
this.nos = nos;
notifyDataSetChanged();
}
@Override
public int getCount() {
return nos.size();
}
@Override
public Object getItem(int position) {
return nos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
// 如果是第一次显示该页面(要记得保存到viewholder中供下次直接从缓存中调用)
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_test, null);
holder.tv_no = (TextView) convertView.findViewById(R.id.tv_no);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_no.setText(nos.get(position));
if(nos.get(position).equals("full")){
convertView.setVisibility(View.INVISIBLE);
}else{
convertView.setVisibility(View.VISIBLE);
}
return convertView;
}
private class ViewHolder {
TextView tv_no;
}
}
public class MainActivity extends AppCompatActivity {
XuListView mLisetview;
MyAdapter adapter;
ArrayList<String> nos = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLisetview = (XuListView) findViewById(R.id.list_test);
ArrayList<String> temp = new ArrayList<String>();
for(int i = 0;i<10;i++){
temp.add(i+"");
}
adapter = new MyAdapter(this,temp);
mLisetview.setAdapter(adapter);
//滚动到中间
mLisetview.setSelection(adapter.getCount()/2);
}
}
/**
* Created by xu on 2017/6/27.
*/
public class MyAdapter extends BaseAdapter {
ArrayList<String> nos = new ArrayList<String>();
private Context context;
public MyAdapter(Context context, ArrayList<String> nos){
this.context = context;
this.nos = nos;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object getItem(int position) {
return nos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
// 如果是第一次显示该页面(要记得保存到viewholder中供下次直接从缓存中调用)
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_test, null);
holder.tv_no = (TextView) convertView.findViewById(R.id.tv_no);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_no.setText(nos.get(position%nos.size()));
return convertView;
}
private class ViewHolder {
TextView tv_no;
}
}
/**
* 可视的item数
*/
private int mVisibleItemCount = -1;
/**
* 没调整之前每个item的高度
*/
private float olditemheight = 0;
/**
* 调整过后的每个item的高度
*/
private float newitemheight = -1;
/**
* 调整每个可视的item的高度 以及对内容进行缩放
*/
public void reSetItemHeight() {
for (int i = 0; i < getChildCount(); i++) {
//获取item
View temp_view = getChildAt(i);
//设置item的高度
ViewGroup.LayoutParams lp = temp_view.getLayoutParams();
lp.height = (int) newitemheight;
temp_view.setLayoutParams(lp);
//缩放内容 我的item的内容用一个LinearLayout包了起来 所以直接缩放LinearLayout
LinearLayout item_ll_value = (LinearLayout) temp_view.findViewById(R.id.item_ll_value);
item_ll_value.setScaleY((newitemheight / olditemheight) < 0 ? 0 : (newitemheight / olditemheight));
item_ll_value.setScaleX((newitemheight / olditemheight) < 0 ? 0 : (newitemheight / olditemheight));
}
}
/**
* 计算在给定的可视item数目下 每个item应该设置的高度
* */
private void getNewItemHeight() {
//先把旧的item存起来
olditemheight = getChildAt(0).getHeight();
//计算新的高度
newitemheight = getHeight() / mVisibleItemCount;
if ((getHeight() / mVisibleItemCount) % newitemheight > 0) {
//除不尽的情况下把余数分给各个item,暂时发现分一次余数就够了,如果效果不理想就做个递归多分几次
float remainder = (getHeight() / mVisibleItemCount) % newitemheight;
newitemheight = remainder / mVisibleItemCount;
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//滚动结束之后开始回滚item
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && mVisibleItemCount != -1) {
//使离中间最近的item回滚到中点位置
smoothScrollToPosition(getFirstVisiblePosition());
}
}
/**
* 当前选中项发生变化的监听者
*/
private onSelectionChangeLisenter selectionChangeLisenter;
/**
* 设置选中项的监听者
*/
public void setSelectionChangeLisenter(onSelectionChangeLisenter selectionChangeLisenter) {
this.selectionChangeLisenter = selectionChangeLisenter;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//滚动结束之后开始正常回滚item并记录最中间的item为选中项 (必须设置可视项,ListView才会改为选择器模式)
if( scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && mVisibleItemCount != -1){
//使离中间最近的item回滚到中点位置
smoothScrollToPosition(getFirstVisiblePosition());
//计算当前选中项的序号
int nowPosition = getFirstVisiblePosition() + mVisibleItemCount/2;
//把当前选中项的序号存起来并通过listener回调出去
if(selectionChangeLisenter != null && nowPosition != curPosition){
curPosition = nowPosition;
selectionChangeLisenter.onSelectionChange(curPosition);
}
}
}
/**
* Created by xu on 2017/3/3.
*/
public interface onSelectionChangeLisenter {
void onSelectionChange(int position);
}
//设置ListView的可视item数(必须是奇数)
mLisetview.setVisibleItemCount(3);
//设置监听者监听选中项的变化
mLisetview.setSelectionChangeLisenter(new onSelectionChangeLisenter() {
@Override
public void onSelectionChange(final int position) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"选择项发生变化 当前选中序号:"+(temp.get(position)),Toast.LENGTH_SHORT).show();
}
});
}
});
/**
* 模仿滚轮动画缩放的ListView
* Created by xu on 2017/3/3.
*/
public class XuListView extends ListView implements AbsListView.OnScrollListener {
private static final String TAG = "XuListView";
/**
* 中点的Y坐标
*/
private float centerY = 0f;
/**
* 可视的item数
*/
private int mVisibleItemCount = -1;
/**
* 没调整之前每个item的高度
*/
private float olditemheight = 0;
/**
* 调整过后的每个item的高度
*/
private float newitemheight = -1;
/**
* 当前选中项发生变化的监听者
*/
private onSelectionChangeLisenter selectionChangeLisenter;
/**
* 当前选中项的序号
*/
private int curPosition = -1;
public XuListView(Context context, AttributeSet attrs) {
super(context, attrs);
//设置一个滚动监听
setOnScrollListener(this);
}
/**
* 设置选中项的监听者
*/
public void setSelectionChangeLisenter(onSelectionChangeLisenter selectionChangeLisenter) {
this.selectionChangeLisenter = selectionChangeLisenter;
}
/**
* 设置ListView的显示item数
* @param count :必须是奇数 如果为-1 则表示只是使用动画效果的普通ListView
*/
public boolean setVisibleItemCount(int count){
if(count % 2 == 0){
return false;
}else{
mVisibleItemCount = count;
return true;
}
}
/**
* 在这里第一次调整item高度
*/
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
if(mVisibleItemCount != -1){
getNewItemHeight();
reSetItemHeight();
}
}
/**
* 调整每个可视的item的高度 以及对内容进行缩放
*/
public void reSetItemHeight(){
for(int i = 0; i < getChildCount(); i++){
//获取item
View temp_view = getChildAt(i);
//设置item的高度
ViewGroup.LayoutParams lp = temp_view.getLayoutParams();
lp.height = (int)newitemheight;
temp_view.setLayoutParams(lp);
//缩放内容 我的item的内容用一个LinearLayout包了起来 所以直接缩放LinearLayout
LinearLayout item_ll_value = (LinearLayout)temp_view.findViewById(R.id.item_ll_value);
item_ll_value.setScaleY((newitemheight / olditemheight) < 0 ? 0 : (newitemheight / olditemheight));
item_ll_value.setScaleX((newitemheight / olditemheight) < 0 ? 0 : (newitemheight / olditemheight));
}
}
/**
* 计算在给定的可视item数目下 每个item应该设置的高度
*/
private void getNewItemHeight(){
//先把旧的item存起来
olditemheight = getChildAt(0).getHeight();
//计算新的高度
newitemheight = getHeight()/mVisibleItemCount;
if((getHeight()/mVisibleItemCount) % newitemheight > 0){
//除不尽的情况下把余数分给各个item,暂时发现分一次余数就够了,如果效果不理想就做个递归多分几次
float remainder = (getHeight()/mVisibleItemCount) % newitemheight;
newitemheight = remainder/mVisibleItemCount;
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//滚动结束之后开始正常回滚item并记录最中间的item为选中项 (必须设置可视项,ListView才会改为选择器模式)
if( scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && mVisibleItemCount != -1){
//使离中间最近的item回滚到中点位置
smoothScrollToPosition(getFirstVisiblePosition());
//计算当前选中项的序号
int nowPosition = getFirstVisiblePosition() + mVisibleItemCount/2;
//把当前选中项的序号存起来并通过listener回调出去
if(selectionChangeLisenter != null && nowPosition != curPosition){
curPosition = nowPosition;
selectionChangeLisenter.onSelectionChange(curPosition);
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//计算中点
centerY = getHeight()/2;
//判断中点的有效性
if(centerY <= 0){
return;
}
//开始对当前显示的View进行缩放
for(int i = 0; i < visibleItemCount; i++){
//获取item
View temp_view = getChildAt(i);
//计算item的中点Y坐标
float itemY = temp_view.getBottom()-(temp_view.getHeight()/2);
//计算离中点的距离
float distance = centerY;
if(itemY > centerY){
distance = itemY - centerY;
}else{
distance = centerY - itemY;
}
//根据距离进行缩放
temp_view.setScaleY(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
temp_view.setScaleX(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
//根据距离改变透明度
temp_view.setAlpha(1.1f - (distance / centerY) < 0 ? 0 : 1.1f - (distance / centerY));
}
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有