单手操作图片控件 镜像、置顶、缩放、移动:StickerView

来源:互联网 发布:单片机LED接线 编辑:程序博客网 时间:2024/04/26 13:29
单手操作图片控件 镜像、置顶、缩放、移动



import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Canvas;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.RelativeLayout;  import com.example.abner.stickerdemo.utils.FileUtils;import com.example.abner.stickerdemo.view.StickerView;  import java.util.ArrayList;  public class MainActivity extends AppCompatActivity {      //当前处于编辑状态的贴纸    private StickerView mCurrentView;      //存储贴纸列表    private ArrayList<View> mStickers;      private RelativeLayout mContentRootView;      @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mContentRootView = (RelativeLayout) findViewById(R.id.rl_content_root);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);          FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                addStickerView();            }        });        mStickers = new ArrayList<>();      }      @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }      @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();          //noinspection SimplifiableIfStatement        if (id == R.id.action_complete) {            mCurrentView.setInEdit(false);            generateBitmap();            return true;        }          return super.onOptionsItemSelected(item);    }      //添加表情    private void addStickerView() {        final StickerView stickerView = new StickerView(this);        stickerView.setImageResource(R.mipmap.ic_cat);        stickerView.setOperationListener(new StickerView.OperationListener() {            @Override            public void onDeleteClick() {                mStickers.remove(stickerView);                mContentRootView.removeView(stickerView);            }              @Override            public void onEdit(StickerView stickerView) {                mCurrentView.setInEdit(false);                mCurrentView = stickerView;                mCurrentView.setInEdit(true);            }              @Override            public void onTop(StickerView stickerView) {                int position = mStickers.indexOf(stickerView);                if (position == mStickers.size() - 1) {                    return;                }                StickerView stickerTemp = (StickerView) mStickers.remove(position);                mStickers.add(mStickers.size(), stickerTemp);            }        });        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);        mContentRootView.addView(stickerView, lp);        mStickers.add(stickerView);        setCurrentEdit(stickerView);    }      /**     * 设置当前处于编辑模式的贴纸     */    private void setCurrentEdit(StickerView stickerView) {        if (mCurrentView != null) {            mCurrentView.setInEdit(false);        }        mCurrentView = stickerView;        stickerView.setInEdit(true);    }      private void generateBitmap() {          Bitmap bitmap = Bitmap.createBitmap(mContentRootView.getWidth(),                mContentRootView.getHeight()                , Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(bitmap);        mContentRootView.draw(canvas);          String iamgePath = FileUtils.saveBitmapToLocal(bitmap, this);        Intent intent = new Intent(this, DisplayActivity.class);        intent.putExtra("image", iamgePath);        startActivity(intent);    }  }




http://www.23code.com/imageprocessing/
ImageProcessing这个贴纸Demo是基于 http://blog.isming.me/2015/05/10/sticker-view/ 现有基础的优化。

优化内容

1、加入了多张贴纸功能

2、对于贴纸边界的判断