텍스트 제목이 있는 폭포 흐름 효과 사용자 정의

6966 단어 android
인터넷에서 찾을 수 있는 대부분의 자료 중의 폭포류 효과는 모두 단순한 사진으로 이루어진 것이다. 이제 나는 글의 제목을 가진 것을 실현할 것이다.효과는 다음과 같습니다.
모든 item은 그림과 텍스트 제목 두 부분으로 구성되어 있다.
레이아웃 방식은 ScrollView에 수평방향의 LinearLayout을 끼워 넣고 그 안에 수직방향의 LinearLayout을 두 개 끼워 넣은 다음에 수직방향의 두 개의 LinearLayout의 높이를 판단하고 비교적 낮은 Linearlayout에 item을 추가한다.
다음은 코드입니다.


  

        
        

        
        

    

FlowView 사용자 정의
public class FlowView extends ImageView implements View.OnClickListener,
		View.OnLongClickListener {

	private Context mContext;
	public Bitmap bitmap;
	private int columnIndex;
	private int rowIndex;
	private Handler viewHandler;
	private String tag;

	@Override
	public void setTag(Object tag) {
		// TODO Auto-generated method stub
		super.setTag(tag);
		this.tag =  (String) tag;
	}

	public FlowView(Context c, AttributeSet attrs, int defStyle) {
		super(c, attrs, defStyle);
		this.mContext = c;
		Init();
	}

	public FlowView(Context c, AttributeSet attrs) {
		super(c, attrs);
		this.mContext = c;
		Init();
	}

	public FlowView(Context c) {
		super(c);
		this.mContext = c;
		Init();
	}

	private void Init() {

		setOnClickListener(this);
		this.setOnLongClickListener(this);
		setAdjustViewBounds(true);

	}

	@Override
	public boolean onLongClick(View v) {
		return true;
	}
	private Handler mHandler;
	public void setHandler(Handler handler){
		mHandler=handler;
	}
	@Override
	public void onClick(View v) {
		Message msg=new Message();
		Bundle bun=new Bundle();
		bun.putString("tag", tag);
		msg.what=1;
		msg.setData(bun);
		mHandler.sendMessage(msg);
		

	}

	public int getColumnIndex() {
		return columnIndex;
	}

	public void setColumnIndex(int columnIndex) {
		this.columnIndex = columnIndex;
	}

	public int getRowIndex() {
		return rowIndex;
	}

	public void setRowIndex(int rowIndex) {
		this.rowIndex = rowIndex;
	}

	public Handler getViewHandler() {
		return viewHandler;
	}

	public FlowView setViewHandler(Handler viewHandler) {
		this.viewHandler = viewHandler;
		return this;
	}

}

그리고
public class MainActivity extends Activity {
	private LinearLayout lvCasecade1;
	private LinearLayout lvCasecade2;
	private Display display;
	private int casecadeWidth;
	private ArrayList mBaoBeiList = new ArrayList();
	private LinearLayout[] mRelativeLayout;
	private BitmapUtils mBitmapUtils;
	
	private int mJ, mPosition;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		display = this.getWindowManager().getDefaultDisplay();
		casecadeWidth = display.getWidth() / 2;
		initData();
		initView();
	}

	private void initData() {
		if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
			File file = new File(Environment.getExternalStorageDirectory()
					+ "/imageCache");
			if (!file.exists()) {
				file.mkdirs();
			}
			mBitmapUtils = new BitmapUtils(this, file.getAbsolutePath());
		} else {
			mBitmapUtils = new BitmapUtils(this, null);
		}
		for (int i = 0; i < BaseData.imageUris.length; i++) {
			mBaoBeiList.add(new BaoBei(BaseData.titles[i], BaseData.imageUris[i]));
		
			};

}

	private void initView() {
		lvCasecade1 = (LinearLayout) findViewById(R.id.casecade1);
		lvCasecade2 = (LinearLayout) findViewById(R.id.casecade2);
		LayoutParams lp1 = lvCasecade1.getLayoutParams();
		lp1.width = casecadeWidth;
		lvCasecade1.setLayoutParams(lp1);

		LayoutParams lp2 = lvCasecade2.getLayoutParams();
		lp2.width = casecadeWidth;
		lvCasecade2.setLayoutParams(lp2);
	
		if (mBaoBeiList.size() > mPosition) {

			addImgToCasecade(mBaoBeiList.get(mPosition), mJ, mPosition);
		}

	}

	private void addImgToCasecade(final BaoBei bb, int j, final int i) {
		// TODO Auto-generated method stub
		LinearLayout lv = (LinearLayout) LayoutInflater.from(this).inflate(
				R.layout.item, null);
		if (j == 0) {
			lvCasecade1.addView(lv);
		} else if (j == 1) {
			lvCasecade2.addView(lv);
		} 
		final FlowView im = (FlowView) lv.findViewById(R.id.item_iv);
		im.setHandler(mHandler);
	
		final TextView item_title = (TextView) lv.findViewById(R.id.item_title);

		mBitmapUtils.display(im, bb.getImage(), new BitmapLoadCallBack() {

			@Override
			public void onLoadCompleted(View container, String uri,
					Bitmap bitmap, BitmapDisplayConfig config,
					BitmapLoadFrom from) {
				// TODO Auto-generated method stub
				if (im != null && bb.getImage() != null) {
					im.setImageBitmap(bitmap);
					item_title.setText(bb.getName());

				}
				try {
					int height1 = lvCasecade1.getHeight();
					int height2 = lvCasecade2.getHeight();
					LogUtils.e("height1:" + height1);
					LogUtils.e("height2:" + height2);
					if (height1 <= height2) {
						mJ = 0;
					} else {
						mJ = 1;
					}
					mPosition++;
					if(mBaoBeiList.size()>mPosition){
						
					addImgToCasecade(mBaoBeiList.get(mPosition), mJ, mPosition);
					}
					// Thread.sleep(2000);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			@Override
			public void onLoadFailed(View container, String uri,
					Drawable drawable) {
				// TODO Auto-generated method stub

			}
		});

	}



	private Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			switch (msg.what) {
			case 1:
				Bundle ggItemBundle = msg.getData();
				if (ggItemBundle != null) {
					String address = ggItemBundle.getString("tag");
					Intent intent = new Intent(MainActivity.this,
							TaoBaoActivity.class);
					intent.putExtra("address", address);
					startActivity(intent);

				}
				break;

			default:
				break;
			}
		}

	};
}

참고로 그림의 메모리를 불러오는 처리에 관해서는 xUtils에 맡깁니다.
순수한 그림의 폭포류 효과가 필요하다면 곽림대신의 블로그를 참고하면 된다.http://blog.csdn.net/guolin_blog/article/details/10470797
사실 또 다른 방법은 RecyclerView를 통해 폭포류 효과를 실현하고 갱신할 시간이 있다는 것이다.

좋은 웹페이지 즐겨찾기