package at.tugraz.ist.musicdroid; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.crypto.spec.IvParameterSpec; import android.R; import android.content.Context; import android.content.res.Resources; import android.gesture.GestureOverlayView; import android.gesture.GestureOverlayView.OnGestureListener; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Camera; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Movie; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.WindowManager; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.ScrollView; public class DrawTonesView extends View { private Paint paint; private List tones = new ArrayList<Tone>(); private Context context; private int first_line_; private int id_; private boolean moving_; private boolean auto_scroll_ = false; private int scrollx_ = 0; private int scrolldis_ = 200; private int radius_; private int scroll_counter_ = 0; static int t = 0; private int distance_between_notes_; private int width_ = 0; double downx = 0, downy = 0, upx = 0, upy = 0, down_help_ = 0; public OnTouchListener touchlis = new OnTouchListener() { //@Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: downx = event.getX(); downy = event.getY(); break; case MotionEvent.ACTION_MOVE: // System.out.println(event.getX()+":"+event.getY()); break; case MotionEvent.ACTION_UP: upx = event.getX(); upy = event.getY(); double scrolldist = downx - upx; double scrolldist_vert = downy - upy; if (scrolldist > 30 && (scrolldist_vert < 60 && scrolldist_vert > -60)) { scrollx_ += scrolldis_; scroll_counter_++; if (scrollx_ >= ((Tone) (tones.get(tones.size() - 1))) .get_X() + 50 - v.getWidth()) { scrollx_ = ((Tone) (tones.get(tones.size() - 1))) .get_X() + 50 - v.getWidth(); scroll_counter_--; down_help_ = (scrollx_ + v.getWidth()) % 200; } v.scrollTo(scrollx_, 0); } else if (scrolldist < -30 && (scrolldist_vert < 60 && scrolldist_vert > -60)) { scrollx_ -= scrolldis_; scroll_counter_--; if (scrollx_ < 0) { down_help_ = 0; scrollx_ = 0; scroll_counter_ = 0; } v.scrollTo(scrollx_, 0); } else if (scrolldist > -30 && scrolldist < 30 && scrolldist_vert < 30 && scrolldist_vert > -30) { downx += scroll_counter_ * 200 + down_help_; checkNote((int) downx, (int) downy); } else if (scrolldist_vert > 30) { moveMarkedNotes(true); } else if (scrolldist_vert < -30) { moveMarkedNotes(false); } invalidate(); break; } return true; } }; public DrawTonesView(Context context, int id, int radius, int firstline, boolean scroll) { super(context); // super.setOnClickListener(onclick); super.setOnTouchListener(touchlis); auto_scroll_ = scroll; radius_ = radius; this.context = context; first_line_ = firstline; this.paint = new Paint(); distance_between_notes_ = radius_ * 6; this.setBackgroundColor(Color.WHITE); this.id_ = id; DisplayMetrics metrics = context.getResources().getDisplayMetrics(); width_ = metrics.widthPixels; invalidate(); } @Override public void onDraw(Canvas canvas) { paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); drawLines(canvas); for (int i = 0; i < tones.size(); i++) { ((Tone) (tones.get(i))).draw(canvas); } } private void drawLines(Canvas canvas) { paint.setColor(Color.BLACK); int last_x = 0; if (tones.size() > 0) last_x = ((Tone) (tones.get(tones.size() - 1))).get_X() + 50; if (last_x < this.getRight()) last_x = this.getRight(); drawViolinschluessel(canvas); for (int i = 0; i < 5; i++) { canvas.drawLine(this.getLeft(), first_line_ + i * radius_ * 2, last_x, first_line_ + i * radius_ * 2, paint); } Paint p_ = new Paint(paint); p_.setStrokeWidth(10); canvas.drawLine(last_x - 10, first_line_, last_x - 10, first_line_ + 8 * radius_, paint); canvas.drawLine(last_x, first_line_ - 1, last_x, first_line_ + 8 * radius_ + 1, p_); canvas.drawLine(1, first_line_ - 1, 1, first_line_ + 8 * radius_ + 1, p_); canvas.drawLine(10, first_line_, 10, first_line_ + 8 * radius_, paint); } public void addElement(ArrayList<Integer> midi) { int i = tones.size(); int x = 0; if (i > 0) x = ((Tone) (tones.get(i - 1))).get_X() + distance_between_notes_; else x = 11 * radius_; tones.add(new Tone(super.getContext(), midi, x, first_line_, paint, radius_)); invalidate(); int last_x = ((Tone) (tones.get(tones.size() - 1))).get_X() + 50; if (last_x > this.getWidth()) { if (auto_scroll_) { super.scrollTo(last_x - width_, 0); scroll_counter_ = last_x / 200; down_help_ = last_x % 200; } } } public List getTonesList(){ return tones; } public int getTonesSize(){ return tones.size(); } public void addElement(int midi) { int i = tones.size(); int x = 0; if (i > 0) x = ((Tone) (tones.get(i - 1))).get_X() + distance_between_notes_; else x = 12 * radius_; ArrayList<Integer> i_list = new ArrayList(); i_list.add(midi); tones.add(new Tone(super.getContext(), i_list, x, first_line_, paint, radius_)); invalidate(); int last_x = ((Tone) (tones.get(tones.size() - 1))).get_X() + 50; if (last_x > this.getWidth()) { if (auto_scroll_) { super.scrollTo(last_x - width_, 0); scroll_counter_ = last_x / 200; down_help_ = last_x % 200; } } } public void deleteElement(int i) { if (i > tones.size()) { return; } tones.remove(i); for (int j = i; j < tones.size(); j++) { int x_value = ((Tone) (tones.get(j))).get_X(); ((Tone) (tones.get(j))).setX(x_value - distance_between_notes_); } invalidate(); } public void clearList() { if (!tones.isEmpty()) { tones.clear(); } invalidate(); } private void drawViolinschluessel(Canvas canvas) { Resources res = context.getResources(); Bitmap bm = BitmapFactory.decodeResource(res, id_); // canvas.drawBitmap(bm, 10, 120, null); Rect dst_rct = new Rect(20, first_line_ - 60, 7 * radius_ + 10, first_line_ + 8 * radius_ + 60); canvas.drawBitmap(bm, null, dst_rct, null); } private void checkNote(int x_value, int y_value) { for (int i = 0; i < tones.size(); i++) { int act_x_ = ((Tone) (tones.get(i))).get_X(); ArrayList<Integer> y_s_ = ((Tone) (tones.get(i))).get_Y(); if (y_s_.size() == 1) { if (Math.sqrt(Math.pow(x_value - act_x_, 2) + Math.pow(y_value - y_s_.get(0), 2)) <= 3 * radius_) { ((Tone) (tones.get(i))).setMove(); invalidate(); } } else { for (int j = 0; j < y_s_.size(); j++) { if (Math.sqrt(Math.pow(x_value - act_x_, 2) + Math.pow(y_value - y_s_.get(j), 2)) <= 3 * radius_) { ((Tone) (tones.get(i))).setMove(); invalidate(); } } } } } private void moveMarkedNotes(boolean up) { for (int i = 0; i < tones.size(); i++) { if (((Tone) tones.get(i)).isMarked()) { ((Tone) tones.get(i)).moveMidiVal(up); } } invalidate(); } }