package com.hkm.slider.SliderTypes; import android.animation.LayoutTransition; import android.app.Activity; import android.graphics.RectF; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.DrawableRes; import android.support.annotation.LayoutRes; import android.support.v4.content.ContextCompat; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.github.chrisbanes.photoview.OnMatrixChangedListener; import com.github.chrisbanes.photoview.OnPhotoTapListener; import com.github.chrisbanes.photoview.PhotoView; import com.github.chrisbanes.photoview.PhotoViewAttacher; import com.hkm.slider.R; import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; /** * Created by hesk on 15/12/15. */ public class ZoomableView extends BaseSliderView { private final Activity activity; public final static String LOG_TAG = "ZoomableViewpp"; private boolean animateCloseButton = false, bottomFadeDescription = true; private float initial_zoom_factor = 1.0f; protected Typeface typeface; private int corner_button_image; private Drawable corner_button_image_d; private cornerbuttonOnClick mclick = new cornerbuttonOnClick() { @Override public void click(int button_view_id) { } }; private ZoomCallBack mzoom = new ZoomCallBack() { @Override public void cover(boolean isOn) { } }; /** * the work for the button click listener */ public interface cornerbuttonOnClick { void click(int button_view_id); } public interface ZoomCallBack { void cover(boolean isOn); } public ZoomableView(Activity context) { super(context); activity = context; } public ZoomableView(boolean closeButtonAnimation, Activity context) { this(context); animateCloseButton = closeButtonAnimation; } public ZoomableView setInitalZoomFactor(float a) { initial_zoom_factor = a; return this; } public ZoomableView setDisplayFontName(String name) { typeface = Typeface.createFromAsset(mContext.getAssets(), "fonts/" + name); return this; } public ZoomableView setZoomCallBack(final ZoomCallBack zcb) { mzoom = zcb; return this; } public ZoomableView setCornerButtonImageRes(final @DrawableRes int drawable) { corner_button_image = drawable; return this; } public ZoomableView setCornerButtonImageDrawable(final Drawable drawable) { corner_button_image_d = drawable; return this; } public ZoomableView setCornerButtonClickListener(final cornerbuttonOnClick cb) { mclick = cb; return this; } public ZoomableView setButtomDescription(boolean enableDesc) { bottomFadeDescription = enableDesc; return this; } /** * the extended class have to implement getView(), which is called by the adapter, * every extended class response to render their own view. * * @return View */ @Override public View getView() { View layoutview = LayoutInflater.from(mContext).inflate(getLayoutHolder(), null); filter_apply_event_to_view(layoutview); return layoutview; } protected void filter_apply_event_to_view(View viewLayout) { final LinearLayout cover = (LinearLayout) viewLayout.findViewById(R.id.ssz_bottom_caption); final ImageButton cornerbutton = (ImageButton) viewLayout.findViewById(R.id.ssz_frame_close_window_button); final ProgressBar circle = (ProgressBar) viewLayout.findViewById(R.id.ns_loading_progress); final PhotoView mImage = (PhotoView) viewLayout.findViewById(R.id.ssz_uk_co_senab_photoview); final TextView mCurrMatrixTv = (TextView) viewLayout.findViewById(R.id.ssz_debug_textview); setDebugTextAdvance(mCurrMatrixTv, this); final PhotoViewAttacher mAttacher = new PhotoViewAttacher(mImage); final TextView mCaptv = (TextView) viewLayout.findViewById(R.id.ssz_caption_textview); setCaptionTextviewAdvance(mCaptv, this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { LayoutTransition transitioner = new LayoutTransition(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { transitioner.enableTransitionType(LayoutTransition.CHANGING); } if (bottomFadeDescription) { cover.setLayoutTransition(transitioner); } else { cover.setVisibility(View.GONE); } } if (corner_button_image_d != null) { cornerbutton.setImageDrawable(corner_button_image_d); cornerbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mclick.click(v.getId()); } }); } else if (corner_button_image > 0) { cornerbutton.setImageResource(corner_button_image); cornerbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mclick.click(v.getId()); } }); } else { cornerbutton.setVisibility(View.GONE); } Log.d(LOG_TAG, "load image with url : " + getUrl() + " title:" + getDescription()); Picasso.with(mContext).load(getUrl()).into(mImage, new Callback() { @Override public void onSuccess() { mAttacher.setOnMatrixChangeListener(new MatrixChangeListener(mAttacher, cover, cornerbutton)); mAttacher.setOnPhotoTapListener(new PhotoTapListener()); circle.setVisibility(View.GONE); mImage.post(new Runnable() { @Override public void run() { mAttacher.setScale( initial_zoom_factor, true); } }); //slidrInf.unlock(); //mImage.getImmImage.getWidth() //mAttacher.setScale(initial_zoom_factor); } @Override public void onError() { circle.setVisibility(View.GONE); } }); } @LayoutRes protected int getLayoutHolder() { return R.layout.content_zoomable_slide; } protected void setCaptionTextviewAdvance(final TextView caption, final BaseSliderView display_text) { int color_i = ContextCompat.getColor(mContext, R.color.letterwhite); caption.setTextColor(color_i); caption.setText(display_text.getDescription()); if (typeface != null) { caption.setTypeface(typeface); } } protected void setDebugTextAdvance(final TextView debugfield, final BaseSliderView display) { } public class PhotoTapListener implements OnPhotoTapListener { @Override public void onPhotoTap(ImageView imageView, float x, float y) { float xPercentage = x * 100f; float yPercentage = y * 100f; // Tool.trace(zoomimage.this, String.format(PHOTO_TAP_TOAST_STRING, xPercentage, yPercentage, view == null ? 0 : view.getId())); } } public class MatrixChangeListener implements OnMatrixChangedListener { private final PhotoViewAttacher mAttacher; private final LinearLayout cover; private final ImageButton button; public MatrixChangeListener(PhotoViewAttacher mAttacher, LinearLayout cover, final ImageButton button_close) { this.mAttacher = mAttacher; button = button_close; this.cover = cover; } @Override public void onMatrixChanged(RectF rect) { try { if (mAttacher.getScale() > 1.5f) { cover_on(cover, button); mzoom.cover(true); } else { cover_off(cover, button); mzoom.cover(false); } } catch (Exception e) { Log.d(LOG_TAG, "onMatrix Changed" + e.getMessage()); } } } private void cover_off(LinearLayout cover, final ImageButton cornerButton) { if (bottomFadeDescription && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) cover.animate().alpha(0f); if (animateCloseButton && cornerButton.getVisibility() != View.GONE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) cornerButton.animate().alpha(0f).withEndAction(new Runnable() { @Override public void run() { cornerButton.setEnabled(false); } }); } private void cover_on(LinearLayout cover, final ImageButton cornerButton) { if (bottomFadeDescription && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) cover.animate().alpha(1f); if (animateCloseButton && cornerButton.getVisibility() != View.GONE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) cornerButton.animate().alpha(1f).withEndAction(new Runnable() { @Override public void run() { cornerButton.setEnabled(true); } }); } }